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

File Contents

# Content
1 #include "gestionversion.h"
2 #include "toibrep.h"
3 #include "mg_file.h"
4 #include "ot_mathematique.h"
5 #include "tpl_map_entite.h"
6 #include "tpl_relation_entite.h"
7 #include "tpl_octree.h"
8 #include "toibrep_point.h"
9 #include "vct.h"
10 #include <math.h>
11 #include <fstream>
12 #include <string>
13 #include "IBrep.h"
14 #include "ot_cpu.h"
15 #include "fem_tetra4.h"
16 #include "fem_segment2.h"
17 #include "xfem_tetra4.h"
18 #include "xfem_triangle3.h"
19 #include "xfem_segment2.h"
20 #include "mg_maillage_outils.h"
21
22 class inter_ele_arete
23 {
24 public:
25 FEM_ELEMENT3* ele;
26 XFEM_ELEMENT3* xele;
27 MG_ARETE* are;
28 int status1;
29 int status2;
30 double xyz1[3];
31 double xyz2[3];
32 FEM_NOEUD* no1;
33 FEM_NOEUD* no2;
34 };
35
36
37
38 TOIBREP::TOIBREP(class MG_GESTIONNAIRE *g,class MG_GEOMETRIE *ge,class FEM_MAILLAGE* femm,int nbpas,OT_CPU* compt):geo(ge),gest(g),mai(femm),NPAS(nbpas),affichageactif(0),compteur(compt)
39 {
40 }
41
42 TOIBREP::TOIBREP(class MG_GESTIONNAIRE *g,class MG_GEOMETRIE *ge,class FEM_MAILLAGE* femm,int nbpas):geo(ge),gest(g),mai(femm),NPAS(nbpas),affichageactif(0),compteur(NULL)
43 {
44 }
45 TOIBREP::TOIBREP(class MG_GESTIONNAIRE *g,class MG_GEOMETRIE *ge,class FEM_MAILLAGE* femm):geo(ge),gest(g),mai(femm),NPAS(50),affichageactif(0),compteur(NULL)
46 {
47 }
48 TOIBREP::TOIBREP(class MG_GESTIONNAIRE *g,class MG_GEOMETRIE *ge,class FEM_MAILLAGE* femm,class OT_CPU* compt):geo(ge),gest(g),mai(femm),NPAS(50),affichageactif(0),compteur(compt)
49 {
50 }
51
52 TOIBREP::~TOIBREP()
53 {
54 }
55
56
57
58 void TOIBREP::active_affichage(void (*fonc)(char*))
59 {
60 affiche=fonc;
61 affichageactif=1;
62 }
63
64
65
66 double TOIBREP::calculdist(double *n,double x,double y,double z,FEM_NOEUD* noeud)
67 {
68 double* xyz=noeud->get_coord();
69 double dist=sqrt((xyz[0]-x)*(xyz[0]-x)+(xyz[1]-y)*(xyz[1]-y)+(xyz[2]-z)*(xyz[2]-z));
70 OT_VECTEUR_3D vec1(n[0],n[1],n[2]);
71 OT_VECTEUR_3D vec2(xyz[0]-x,xyz[1]-y,xyz[2]-z);
72 double ps=vec1*vec2;
73 if (ps<0.) dist=-dist;
74 return dist;
75 }
76
77 void TOIBREP::recherche_arete_tangeante(TPL_MAP_ENTITE<MG_ARETE*> &lst,TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*> &lsttopo)
78 {
79
80
81 LISTE_MG_ARETE::iterator it;
82 for (MG_ARETE* are=geo->get_premier_arete(it);are!=NULL;are=geo->get_suivant_arete(it))
83 {
84 if (lsttopo.existe(are))
85 if (ot.arete_virtuelle(are)) lst.ajouter(are);
86 }
87
88 }
89
90 int TOIBREP::test_du_point_milieu(FEM_NOEUD* no1,FEM_NOEUD* no2,FEM_ELEMENT3* tet)
91 {
92 double *xyz1=no1->get_coord();
93 double *xyz2=no2->get_coord();
94 double xyz[3];
95 xyz[0]=0.5*(xyz1[0]+xyz2[0]);
96 xyz[1]=0.5*(xyz1[1]+xyz2[1]);
97 xyz[2]=0.5*(xyz1[2]+xyz2[2]);
98 FEM_MAILLAGE_OUTILS ot;
99 if (((ot.estdansletetra(tet,xyz[0],xyz[1],xyz[2])>>1)&1)!=0) return 1;
100 //if (((MG_MAILLAGE_OUTILS::estdansletetra(tet,xyz[0],xyz[1],xyz[2])>>1)&1)==1) return 1;
101 return 0;
102 }
103
104
105 void TOIBREP::oriente_tri(XFEM_ELEMENT2* tri,MG_FACE* face)
106 {
107 FEM_NOEUD* no1=tri->get_fem_noeud(0);
108 FEM_NOEUD* no2=tri->get_fem_noeud(1);
109 FEM_NOEUD* no3=tri->get_fem_noeud(2);
110 OT_VECTEUR_3D n1n2(no1->get_coord(),no2->get_coord());
111 OT_VECTEUR_3D n1n3(no1->get_coord(),no3->get_coord());
112 OT_VECTEUR_3D normal=n1n2&n1n3;
113 double *xyz=no1->get_coord();
114 double uv[0];
115 face->inverser(uv,xyz);
116 double n[3];
117 face->calcul_normale_unitaire(uv,n);
118 OT_VECTEUR_3D dir(n);
119 normal.norme();
120 double ps=normal*dir;
121 if (ps<0)
122 {
123 tri->change_noeud(1,no3);
124 tri->change_noeud(2,no2);
125 }
126 }
127
128 //void TOIBREP::importer(std::string nomfichier,class MagXchange* data,std::string nomfichierout)
129 IBrep TOIBREP::importer(std::string nomfichier,std::string nomfichieribrep,MG_GROUPE_TOPOLOGIQUE* mggt)
130 {
131 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 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 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 //if (compteur!=NULL) compteur->ajouter_etape("Traitement de base selection");
164 int nb_noeud=mai->get_nb_fem_noeud();
165 int nb_element3=mai->get_nb_fem_element3();
166 std::string nomfichier2=nomfichier+"_dis.sol";
167 FEM_SOLUTION* solution=new FEM_SOLUTION(mai,nbvraiface+lstaretetan.get_nb(),(char*)nomfichier2.c_str(),nb_noeud,"LS",MAGIC::ENTITE_SOLUTION::ENTITE_NOEUD);
168 int i=0;
169 gest->ajouter_fem_solution(solution);
170 nomfichier2=nomfichier+"_ele.sol";
171 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 gest->ajouter_fem_solution(solution_ele);
173 for (MG_ELEMENT_TOPOLOGIQUE* ele=lst.get_premier(it);ele!=NULL;ele=lst.get_suivant(it))
174 {
175 if (ele->get_dimension()!=2) continue;
176 char mess[255];
177 sprintf(mess,"F %lu",ele->get_id());
178 solution->change_legende(i,mess);
179 solution_ele->change_legende(i,mess);
180 ++i;
181 }
182 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
192
193 //if (compteur!=NULL) compteur->ajouter_etape("Traitement de base creation solution");
194 double xmin=1e300,ymin=1e300,zmin=1e308;
195 double xmax=-1e300,ymax=-1e300,zmax=-1e308;
196 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 {
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 for (int j=0;j<nbvraiface+lstaretetan.get_nb();j++)
209 solution->ecrire(1e300,i,j);
210 lst_noeud.ajouter(noeud);
211 i++;
212 }
213 //if (compteur!=NULL) compteur->ajouter_etape("Traitement de base recherche boite");
214 octree_tetra.initialiser(&lst_noeud,1,xmin,ymin,zmin,xmax,ymax,zmax);
215 //if (compteur!=NULL) compteur->ajouter_etape("Traitement de base ini octree");
216 LISTE_FEM_ELEMENT3::iterator it3;
217 i=0;
218 for (FEM_ELEMENT3* tet=mai->get_premier_element3(it3);tet!=NULL;tet=mai->get_suivant_element3(it3))
219 {
220 octree_tetra.inserer(tet);
221 for (int j=0;j<nbvraiface+lstaretetan.get_nb();j++)
222 solution_ele->ecrire(0,i,j);
223 i++;
224 }
225 if (compteur!=NULL) compteur->ajouter_etape("Traitement de base");
226 for (int i=0;i<nbface;i++)
227 //for (int i=0;i<1;i++)
228 {
229 MG_FACE* face=geo->get_mg_face(i);
230 //MG_FACE* face=geo->get_mg_faceid(757);
231 if (affichageactif)
232 {
233 char mess[300];
234 sprintf(mess," Face %d numero %lu",i,face->get_id());
235 affiche(mess);
236 }
237 if (!lst.existe(face)) continue;
238 vector<MG_FACE*> lstface;
239 lstface.push_back(face);
240 /// ici topologie virtuelle
241
242
243 /*TPL_LISTE_ENTITE<double> lst;
244 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 }*/
275 //levelsetn(&lst,&lstface,solution,solution_ele,i);
276 }
277
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 affiche((char*)"Exportation IBREP");
294 IBrep brep=exporter_IBrep(nomfichieribrep,solution,solution_ele,mggt);
295 if (compteur!=NULL) compteur->ajouter_etape("Exportation IBREP");
296 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 return brep;
306 }
307
308
309
310
311 void TOIBREP::cree_tag_maillage(void)
312 {
313 /*vector<FEM_ELEMENT3*> couche;
314 LISTE_FEM_ELEMENT3::iterator ittetra;
315 for (FEM_ELEMENT3 *tet=mai->get_premier_element3(ittetra);tet!=NULL;tet=mai->get_suivant_element3(ittetra))
316 {
317 if (tet->est_decoupe_arete_tangeante())
318 {
319 for (int i=tet->get_nb_xfem()-1;i>-1;i--)
320 tet->supprimer_xfem(mai,tet->get_xfem(i));
321 }
322 if (tet->get_nb_xfem()>0)
323 {
324 tet->change_etat(2);
325 couche.push_back(tet);
326 }
327 else tet->change_etat(3);
328 }
329 for (int i=0;i<couche.size();i++)
330 {
331 FEM_ELEMENT3* tet=couche[i];
332 for (int j=0;j<tet->get_nb_fem_noeud();j++)
333 {
334 int propage=0;
335 if (tet->get_etat()==2)
336 {
337 for (int k=0;k<tet->get_nb_xfem();k++)
338 {
339 XFEM_TETRA4* xtet=(XFEM_TETRA4*)tet->get_xfem(k);
340 if (xtet->est_noeud_fem(tet->get_fem_noeud(j))==1) propage=1;
341 }
342 }
343 if (tet->get_etat()!=2) propage=1;
344 if (propage==1)
345 {
346 for (int k=0;k<tet->get_fem_noeud(j)->get_lien_element3()->get_nb();k++)
347 {
348 if (tet->get_fem_noeud(j)->get_lien_element3()->get(k)->get_etat()==3)
349 {
350 tet->get_fem_noeud(j)->get_lien_element3()->get(k)->change_etat(1);
351 couche.push_back(tet->get_fem_noeud(j)->get_lien_element3()->get(k));
352 }
353 }
354 }
355
356 }
357 }
358 double volume=0.;
359 for (FEM_ELEMENT3 *tet=mai->get_premier_element3(ittetra);tet!=NULL;tet=mai->get_suivant_element3(ittetra))
360 {
361 if (tet->get_etat()==1) volume=volume+get_volume(tet);
362 if (tet->get_etat()==2)
363 {
364 for (int i=0;i<tet->get_nb_xfem();i++)
365 {
366 XFEM_TETRA4* xtet=(XFEM_TETRA4*)tet->get_xfem(i);
367 volume=volume+get_volume(xtet);
368 }
369 }
370
371 }
372 char chaine[500];
373 sprintf(chaine," Volume=%le",volume);
374 affiche(chaine);*/
375 }
376
377
378 double TOIBREP::get_volume(FEM_ELEMENT3* tet)
379 {
380 FEM_NOEUD *no1=tet->get_fem_noeud(0);
381 FEM_NOEUD *no2=tet->get_fem_noeud(1);
382 FEM_NOEUD *no3=tet->get_fem_noeud(2);
383 FEM_NOEUD *no4=tet->get_fem_noeud(3);
384 OT_VECTEUR_3D vec12(no1->get_coord(),no2->get_coord());
385 OT_VECTEUR_3D vec13(no1->get_coord(),no3->get_coord());
386 OT_VECTEUR_3D vec14(no1->get_coord(),no4->get_coord());
387 double vol= (vec12&vec13)*vec14*1./6.;
388 return vol;
389 }
390
391
392 void TOIBREP::decoupe_maillage(int num,FEM_SOLUTION* solution,FEM_SOLUTION* solution_ele,int avecsuppression)
393 {
394 /*
395 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 */
442 }
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 }
514 if ((signep==0) && (signem>0)) return -1;
515 if ((signem==0) && (signep>0)) return 1;
516 return 0;
517 }
518
519
520
521 void TOIBREP::traite_arete_tangeante(MG_ARETE* are,int numsol,FEM_SOLUTION* solution,FEM_SOLUTION* solution_ele)
522 {
523 //NPAS=150;
524 solution->active_solution(numsol);
525 solution_ele->active_solution(numsol);
526 vector<TOIBREP_POINT*> lst;
527 LISTE_FEM_ELEMENT3::iterator ittetra;
528 for (FEM_ELEMENT3* tet=mai->get_premier_element3(ittetra);tet!=NULL;tet=mai->get_suivant_element3(ittetra))
529 tet->change_etat(1,0);
530 LISTE_FEM_NOEUD::iterator itnoeud;
531 for (FEM_NOEUD* no=mai->get_premier_noeud(itnoeud);no!=NULL;no=mai->get_suivant_noeud(itnoeud))
532 no->change_etat(1,0);
533 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 TPL_MAP_ENTITE<FEM_ELEMENT3*> liste;
561 octree_tetra.rechercher(xyz[0],xyz[1],xyz[2],0.,liste);
562 TPL_MAP_ENTITE<FEM_ELEMENT3*>::ITERATEUR it;
563 for (FEM_ELEMENT3* tet=liste.get_premier(it);tet!=NULL;tet=liste.get_suivant(it))
564 {
565 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 {
569 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 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 }
579 }
580 if (outilfem.compare_etat_tetra(etat,FEM_MAILLAGE_OUTILS::STRICTINTERIEUR))
581 {
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 tet->change_etat(1,1); //temp
588 tet->get_fem_noeud(k)->change_etat(1,1); //temp
589 }
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 if (noeud->get_etat(1)==1) solution->ecrire(noeud->get_solution(),i,numsol);
601 else solution->ecrire(1e300,i,numsol);
602 ++i;
603 }
604 i=0;
605 for (FEM_ELEMENT3* tet=mai->get_premier_element3(ittetra);tet!=NULL;tet=mai->get_suivant_element3(ittetra))
606 {
607 if (tet->get_etat(1)==1) solution_ele->ecrire(1.,i,numsol);
608 ++i;
609 }
610 int nbpt=lst.size();
611 for (int i=0;i<nbpt;i++) delete lst[i];
612 TOIBREP_POINT::remisecompteurid();
613 }
614
615
616 void TOIBREP::echantillonne_sommets(std::vector<TOIBREP_POINT*> &lst,MG_FACE* face)
617 {
618 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 void TOIBREP::echantillonne_aretes(std::vector<TOIBREP_POINT*> &lst,MG_FACE* face)
661 {
662 echantillonne_sommets(lst,face);
663 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 //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 {
702 if (affichageactif)
703 {
704 char mess[300];
705 sprintf(mess," Echantillonnage");
706 affiche(mess);
707 }
708
709 //solution->active_solution(numsol);
710 //solution_ele->active_solution(numsol);
711 vector<TOIBREP_POINT*> lst;
712 BOITE_2D boite=ot.get_boite_2D(face);
713 echantillonne_aretes(lst,face);
714 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 {
723 orientation=coface->get_orientation();
724 trouve=1;
725 }
726 j++;
727 }
728 while (trouve==0);
729 LISTE_FEM_ELEMENT3::iterator ittetra;
730 for (FEM_ELEMENT3* tet=mai->get_premier_element3(ittetra);tet!=NULL;tet=mai->get_suivant_element3(ittetra))
731 tet->change_etat(1,0);
732 LISTE_FEM_NOEUD::iterator itnoeud;
733 for (FEM_NOEUD* no=mai->get_premier_noeud(itnoeud);no!=NULL;no=mai->get_suivant_noeud(itnoeud))
734 no->change_etat(1,0);
735 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 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 {
754 double uv[2];
755 uv[0]=umin+(i*1.0+0.5)/NPAS*(umax-umin);
756 uv[1]=vmin+(j*1.0+0.5)/NPAS*(vmax-vmin);
757 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 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 // octree.inserer(pt);
807 }
808 }
809 /* debut temp
810 {
811 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 }*/
825 // 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 remplir_trou(&lst,face,orientation,lstentitetopoface);
851 if (compteur!=NULL) compteur->ajouter_etape("Remplissage des trous");
852 //etendrelevelset(solution,numsol);
853 /*int i=0;
854 for (FEM_NOEUD* noeud=mai->get_premier_noeud(itnoeud);noeud!=NULL;noeud=mai->get_suivant_noeud(itnoeud))
855 {
856 if (noeud->get_etat()==1) solution->ecrire(noeud->get_solution(),i,numsol);
857 else solution->ecrire(1e300,i,numsol);
858 ++i;
859 }
860 i=0;
861 for (FEM_ELEMENT3* tet=mai->get_premier_element3(ittetra);tet!=NULL;tet=mai->get_suivant_element3(ittetra))
862 {
863 if (tet->get_etat()==1) solution_ele->ecrire(1.,i,numsol);
864 ++i;
865 }*/
866 int nbpt=lst.size();
867 for (int i=0;i<nbpt;i++) delete lst[i];
868 TOIBREP_POINT::remisecompteurid();
869
870
871
872 }
873 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 TPL_MAP_ENTITE<FEM_ELEMENT3*> lst_element3_concerne;
878 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 LISTE_FEM_ELEMENT3::iterator ittet;
890 int i=0;
891 for (FEM_ELEMENT3* tet=mai->get_premier_element3(ittet);tet!=NULL;tet=mai->get_suivant_element3(ittet))
892 {
893 if (solution_ele->lire(i,num1)>0.000001)
894 lst_element3_concerne.ajouter(tet);
895 if (solution_ele->lire(i,num2)>0.000001)
896 lst_element3_concerne.ajouter(tet);
897 i++;
898 }
899
900
901 int couche_active;
902 int nb_couche=0;
903 do
904 {
905 nb_couche++;
906 TPL_MAP_ENTITE<FEM_ELEMENT3*>::ITERATEUR ittetra;
907 std::vector<FEM_ELEMENT3*> couche;
908 couche_active=0;
909 for (FEM_ELEMENT3* tet=lst_element3_concerne.get_premier(ittetra);tet!=NULL;tet=lst_element3_concerne.get_suivant(ittetra))
910 {
911 if (tet->get_etat(1)!=0) continue;
912 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 if ((no1->get_etat(1)==1) || (no1->get_etat(1)==-1))
919 {
920 nbactif++;
921 if (no1->get_solution()>0.) nbpositif++;
922 }
923 if ((no2->get_etat(1)==1) || (no2->get_etat(1)==-1))
924 {
925 nbactif++;
926 if (no2->get_solution()>0.) nbpositif++;
927 }
928 if ((no3->get_etat(1)==1) || (no3->get_etat(1)==-1))
929 {
930 nbactif++;
931 if (no3->get_solution()>0.) nbpositif++;
932 }
933 if ((no4->get_etat(1)==1) || (no4->get_etat(1)==-1))
934 {
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 FEM_ELEMENT3* tet=couche[i];
946 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 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 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 noeudref->change_etat(1,2);
961 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 for (FEM_ELEMENT3* tet=lst_element3_concerne.get_premier(ittetra);tet!=NULL;tet=lst_element3_concerne.get_suivant(ittetra))
966 {
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 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 {
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 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 reactive=1;
994 couche_active=1;
995
996 }
997
998 }
999 if (!reactive)
1000 {
1001 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 }
1007 }
1008 }
1009 }
1010 while (couche_active==1);
1011 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 {
1014 if (tet->get_etat(1)!=1) continue;
1015 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 tet->change_etat(1,0);
1032 }
1033 }
1034
1035
1036 void TOIBREP::remplir_trou(std::vector<TOIBREP_POINT*> *lst,MG_FACE* face,int sens,TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*> *lstentitetopoface)
1037 {
1038 int castot=0;
1039 int cas=0;
1040 int couche_active;
1041 int nb_couche=0;
1042 LISTE_FEM_ELEMENT3::iterator ittetra;
1043 do
1044 {
1045 nb_couche++;
1046
1047 std::vector<FEM_ELEMENT3*> couche;
1048 couche_active=0;
1049 for (FEM_ELEMENT3* tet=mai->get_premier_element3(ittetra);tet!=NULL;tet=mai->get_suivant_element3(ittetra))
1050 {
1051 if (tet->get_etat(1)!=0) continue;
1052 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 if ((no1->get_etat(1)==1) || (no1->get_etat(1)==-1))
1059 {
1060 nbactif++;
1061 if (no1->get_solution()>0.) nbpositif++;
1062 }
1063 if ((no2->get_etat(1)==1) || (no2->get_etat(1)==-1))
1064 {
1065 nbactif++;
1066 if (no2->get_solution()>0.) nbpositif++;
1067 }
1068 if ((no3->get_etat(1)==1) || (no3->get_etat(1)==-1))
1069 {
1070 nbactif++;
1071 if (no3->get_solution()>0.) nbpositif++;
1072 }
1073 if ((no4->get_etat(1)==1) || (no4->get_etat(1)==-1))
1074 {
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 FEM_ELEMENT3* tet=couche[i];
1086 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 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 MG_FACE* face=pt->get_mg_face();
1097 double uv[2];
1098 double xyz[3];
1099 double dist=calcul_distance(noeudref,face,pt,xyz,uv);
1100 double normal[3];
1101 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 noeudref->change_etat(1,2);
1109 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
1113 }
1114 for (FEM_ELEMENT3* tet=mai->get_premier_element3(ittetra);tet!=NULL;tet=mai->get_suivant_element3(ittetra))
1115 {
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 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 {
1126 castot++;
1127 double lstptdecoup[5*3];
1128 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 int nb=0;
1147 decoupe_tetra_noeud(tet,lstptdecoup,&nb);
1148 for (int i=0;i<nb;i++)
1149 {
1150 if (reactive) continue;
1151 double uv[2];
1152 face->inverser(uv,lstptdecoup+3*i);
1153
1154 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 if (distance>1e-10)
1158 {
1159 cas++;
1160 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 reactive=1;
1166 couche_active=1;
1167 }
1168 }
1169 }
1170 if (!reactive)
1171 {
1172 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 }
1178 }
1179 }
1180 }
1181 while (couche_active==1);
1182 for (FEM_ELEMENT3* tet=mai->get_premier_element3(ittetra);tet!=NULL;tet=mai->get_suivant_element3(ittetra))
1183 {
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 /* 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 if (tet->get_etat(1)!=1) continue;
1196 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 tet->change_etat(1,0);
1209 }
1210 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 }
1224
1225 int TOIBREP::decoupe_tetra(FEM_ELEMENT3* tet,MG_FACE* face)
1226 {
1227 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 if (no1->get_solution()*no2->get_solution()<-0.00000001)
1233 {
1234 double t=no1->get_solution()/(no1->get_solution()-no2->get_solution());
1235 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 }
1248 if (no1->get_solution()*no3->get_solution()<-0.00000001)
1249 {
1250 double t=no1->get_solution()/(no1->get_solution()-no3->get_solution());
1251 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 }
1264 if (no1->get_solution()*no4->get_solution()<-0.00000001)
1265 {
1266 double t=no1->get_solution()/(no1->get_solution()-no4->get_solution());
1267 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 }
1280 if (no2->get_solution()*no3->get_solution()<-0.00000001)
1281 {
1282 double t=no2->get_solution()/(no2->get_solution()-no3->get_solution());
1283 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 }
1297 if (no2->get_solution()*no4->get_solution()<-0.00000001)
1298 {
1299 double t=no2->get_solution()/(no2->get_solution()-no4->get_solution());
1300 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 }
1314 if (no3->get_solution()*no4->get_solution()<-0.00000001)
1315 {
1316 double t=no3->get_solution()/(no3->get_solution()-no4->get_solution());
1317 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 }
1479
1480
1481
1482
1483 void TOIBREP::decoupe_tetra_noeud(FEM_ELEMENT3* tet,double* lst,int *nb)
1484 {
1485 FEM_NOEUD* no1=tet->get_fem_noeud(0);
1486 FEM_NOEUD* no2=tet->get_fem_noeud(1);
1487 FEM_NOEUD* no3=tet->get_fem_noeud(2);
1488 FEM_NOEUD* no4=tet->get_fem_noeud(3);
1489 if (no1->get_solution()*no2->get_solution()<-0.00000001)
1490 {
1491 double t=no1->get_solution()/(no1->get_solution()-no2->get_solution());
1492 double x=no1->get_x()+t*(no2->get_x()-no1->get_x());
1493 double y=no1->get_y()+t*(no2->get_y()-no1->get_y());
1494 double z=no1->get_z()+t*(no2->get_z()-no1->get_z());
1495 lst[3*(*nb)]=x;
1496 lst[3*(*nb)+1]=y;
1497 lst[3*(*nb)+2]=z;
1498 (*nb)++;
1499 }
1500 if (no1->get_solution()*no3->get_solution()<-0.00000001)
1501 {
1502 double t=no1->get_solution()/(no1->get_solution()-no3->get_solution());
1503 double x=no1->get_x()+t*(no3->get_x()-no1->get_x());
1504 double y=no1->get_y()+t*(no3->get_y()-no1->get_y());
1505 double z=no1->get_z()+t*(no3->get_z()-no1->get_z());
1506 lst[3*(*nb)]=x;
1507 lst[3*(*nb)+1]=y;
1508 lst[3*(*nb)+2]=z;
1509 (*nb)++;
1510 }
1511 if (no1->get_solution()*no4->get_solution()<-0.00000001)
1512 {
1513 double t=no1->get_solution()/(no1->get_solution()-no4->get_solution());
1514 double x=no1->get_x()+t*(no4->get_x()-no1->get_x());
1515 double y=no1->get_y()+t*(no4->get_y()-no1->get_y());
1516 double z=no1->get_z()+t*(no4->get_z()-no1->get_z());
1517 lst[3*(*nb)]=x;
1518 lst[3*(*nb)+1]=y;
1519 lst[3*(*nb)+2]=z;
1520 (*nb)++;
1521 }
1522 if (no2->get_solution()*no3->get_solution()<-0.00000001)
1523 {
1524 double t=no2->get_solution()/(no2->get_solution()-no3->get_solution());
1525 double x=no2->get_x()+t*(no3->get_x()-no2->get_x());
1526 double y=no2->get_y()+t*(no3->get_y()-no2->get_y());
1527 double z=no2->get_z()+t*(no3->get_z()-no2->get_z());
1528 lst[3*(*nb)]=x;
1529 lst[3*(*nb)+1]=y;
1530 lst[3*(*nb)+2]=z;
1531 (*nb)++;
1532 }
1533 if (no2->get_solution()*no4->get_solution()<-0.00000001)
1534 {
1535 double t=no2->get_solution()/(no2->get_solution()-no4->get_solution());
1536 double x=no2->get_x()+t*(no4->get_x()-no2->get_x());
1537 double y=no2->get_y()+t*(no4->get_y()-no2->get_y());
1538 double z=no2->get_z()+t*(no4->get_z()-no2->get_z());
1539 lst[3*(*nb)]=x;
1540 lst[3*(*nb)+1]=y;
1541 lst[3*(*nb)+2]=z;
1542 (*nb)++;
1543 }
1544 if (no3->get_solution()*no4->get_solution()<-0.00000001)
1545 {
1546 double t=no3->get_solution()/(no3->get_solution()-no4->get_solution());
1547 double x=no3->get_x()+t*(no4->get_x()-no3->get_x());
1548 double y=no3->get_y()+t*(no4->get_y()-no3->get_y());
1549 double z=no3->get_z()+t*(no4->get_z()-no3->get_z());
1550 lst[3*(*nb)]=x;
1551 lst[3*(*nb)+1]=y;
1552 lst[3*(*nb)+2]=z;
1553 (*nb)++;
1554 }
1555 }
1556
1557 void TOIBREP::calcullevelsetpremierepasse(MG_FACE* face,int sens,vector<TOIBREP_POINT*> *lst,int n1,int n2)
1558 {
1559 /*LISTE_FEM_ELEMENT3::iterator it3;
1560 for (FEM_ELEMENT3* tet=mai->get_premier_element3(it3);tet!=NULL;tet=mai->get_suivant_element3(it3))
1561 {
1562 double *xyz1,*xyz2,*xyz3,*xyz4;
1563 if (tet->get_nb_fem_noeud()==4)
1564 {
1565 xyz1=tet->get_fem_noeud(0)->get_coord();
1566 xyz2=tet->get_fem_noeud(1)->get_coord();
1567 xyz3=tet->get_fem_noeud(2)->get_coord();
1568 xyz4=tet->get_fem_noeud(3)->get_coord();
1569 }
1570 if (tet->get_nb_fem_noeud()==10)
1571 {
1572 xyz1=tet->get_fem_noeud(0)->get_coord();
1573 xyz2=tet->get_fem_noeud(2)->get_coord();
1574 xyz3=tet->get_fem_noeud(4)->get_coord();
1575 xyz4=tet->get_fem_noeud(9)->get_coord();
1576 }
1577 double xcentre=0.25*(xyz1[0]+xyz2[0]+xyz3[0]+xyz4[0]);
1578 double ycentre=0.25*(xyz1[1]+xyz2[1]+xyz3[1]+xyz4[1]);
1579 double zcentre=0.25*(xyz1[2]+xyz2[2]+xyz3[2]+xyz4[2]);
1580 double rayon1=(xyz1[0]-xcentre)*(xyz1[0]-xcentre)+(xyz1[1]-ycentre)*(xyz1[1]-ycentre)+(xyz1[2]-zcentre)*(xyz1[2]-zcentre);
1581 double rayon2=(xyz2[0]-xcentre)*(xyz2[0]-xcentre)+(xyz2[1]-ycentre)*(xyz2[1]-ycentre)+(xyz2[2]-zcentre)*(xyz2[2]-zcentre);
1582 double rayon3=(xyz3[0]-xcentre)*(xyz3[0]-xcentre)+(xyz3[1]-ycentre)*(xyz3[1]-ycentre)+(xyz3[2]-zcentre)*(xyz3[2]-zcentre);
1583 double rayon4=(xyz4[0]-xcentre)*(xyz4[0]-xcentre)+(xyz4[1]-ycentre)*(xyz4[1]-ycentre)+(xyz4[2]-zcentre)*(xyz4[2]-zcentre);
1584 double rayon=std::max(rayonETRA_ACTIF1,std::max(rayon2,std::max(rayon3,rayon4)));
1585 rayon=sqrt(rayon);
1586 TPL_MAP_ENTITE<TOIBREP_POINT*> liste;
1587 octree.rechercher(xcentre,ycentre,zcentre,rayon,liste);
1588 TPL_MAP_ENTITE<TOIBREP_POINT*>::ITERATEUR it;
1589 for (TOIBREP_POINT* pt=liste.get_premier(it);pt!=NULL;pt=liste.get_suivant(it))
1590 {
1591 double xyzpt[3];
1592 pt->get_coord3(xyzpt);
1593 int etat=estdansletetra(tet,xyzpt[0],xyzpt[1],xyzpt[2]);
1594 if (compare_etat(etat,INTERIEUR))
1595 {
1596 for (int k=0;k<tet->get_nb_fem_noeud();k++)
1597 {
1598 double normal[3];
1599 double uv[2];
1600 face->inverser(uv,xyzpt);
1601 face->calcul_normale_unitaire(uv,normal);
1602 normal[0]=normal[0]*sens*(-1.);
1603 normal[1]=normal[1]*sens*(-1.);
1604 normal[2]=normal[2]*sens*(-1.);
1605 double dist=calculdist(normal,xyzpt[0],xyzpt[1],xyzpt[2],tet->get_fem_noeud(k));
1606 if (fabs(dist)<fabs(tet->get_fem_noeud(k)->get_solution()))
1607 {
1608 tet->get_fem_noeud(k)->change_solution(dist);
1609 tet->get_fem_noeud(k)->change_numero(pt->get_id());
1610 pt->change_coord2(uv);
1611 }
1612 }
1613 }
1614 if ((compare_etat(etat,STRICTINTERIEUR)) && (pt->get_interieur()))
1615 {
1616 tet->change_etat(1);
1617 for (int k=0;k<tet->get_nb_fem_noeud();k++)
1618 tet->get_fem_noeud(k)->change_etat(1);
1619 }
1620 if (tet->get_etat()==1) break;
1621 }
1622
1623 }
1624 octree.vide();
1625 it}*/
1626 /*LISTE_FEM_ELEMENT3::iterator it3;
1627 for (FEM_ELEMENT3* tet=mai->get_premier_element3(it3);tet!=NULL;tet=mai->get_suivant_element3(it3))
1628 octree.inserer(tet);*/
1629 for (int i=n1;i<n2;i++)
1630 {
1631 TOIBREP_POINT* pt=(*lst)[i];
1632 double uv[2];
1633 double xyz[3];
1634 pt->get_coord3(xyz);
1635 double normal[3];
1636 face->inverser(uv,xyz);
1637 face->calcul_normale_unitaire(uv,normal);
1638 normal[0]=normal[0]*sens*(-1.);
1639 normal[1]=normal[1]*sens*(-1.);
1640 normal[2]=normal[2]*sens*(-1.);
1641 TPL_MAP_ENTITE<FEM_ELEMENT3*> liste;
1642 octree_tetra.rechercher(xyz[0],xyz[1],xyz[2],0.,liste);
1643 TPL_MAP_ENTITE<FEM_ELEMENT3*>::ITERATEUR it;
1644 for (FEM_ELEMENT3* tet=liste.get_premier(it);tet!=NULL;tet=liste.get_suivant(it))
1645 {
1646 if (tet->get_etat(1)==1) continue;
1647 int etat=outilfem.estdansletetra(tet,xyz[0],xyz[1],xyz[2]);
1648 if ((outilfem.compare_etat_tetra(etat,FEM_MAILLAGE_OUTILS::SUR_FACE)) && (pt->get_interieur()))
1649 {
1650 int nbeps=pt->get_nb_point_eps();
1651 for (int k=0;k<nbeps;k++)
1652 {
1653 double xyztmp[3];
1654 pt->get_point_eps(k,xyztmp);
1655 int etattmp=outilfem.estdansletetra(tet,xyztmp[0],xyztmp[1],xyztmp[2]);
1656 if (outilfem.compare_etat_tetra(etattmp,FEM_MAILLAGE_OUTILS::SUR_FACE)) {etat=FEM_MAILLAGE_OUTILS::STRICTINTERIEUR;break;}
1657 if (outilfem.compare_etat_tetra(etattmp,FEM_MAILLAGE_OUTILS::INTERIEUR)) {etat=FEM_MAILLAGE_OUTILS::STRICTINTERIEUR;break;}
1658 if (outilfem.compare_etat_tetra(etattmp,FEM_MAILLAGE_OUTILS::STRICTINTERIEUR)) {etat=FEM_MAILLAGE_OUTILS::STRICTINTERIEUR;break;}
1659 }
1660 }
1661 if (outilfem.compare_etat_tetra(etat,FEM_MAILLAGE_OUTILS::INTERIEUR))
1662 {
1663 for (int k=0;k<tet->get_nb_fem_noeud();k++)
1664 {
1665 double dist=calculdist(normal,xyz[0],xyz[1],xyz[2],tet->get_fem_noeud(k));
1666 if (fabs(dist)<fabs(tet->get_fem_noeud(k)->get_solution()))
1667 {
1668 tet->get_fem_noeud(k)->change_solution(dist);
1669 tet->get_fem_noeud(k)->change_numero(pt->get_id());
1670 pt->change_coord2(uv);
1671 }
1672 }
1673 }
1674 if ((outilfem.compare_etat_tetra(etat,FEM_MAILLAGE_OUTILS::STRICTINTERIEUR)) && (pt->get_interieur()))
1675 {
1676 tet->change_etat(1,1);
1677 for (int k=0;k<tet->get_nb_fem_noeud();k++)
1678 {
1679 tet->get_fem_noeud(k)->change_etat(1,1);
1680 //octree.supprimer(tet);
1681 }
1682 }
1683 }
1684 }
1685 //octree.vide();
1686
1687
1688
1689
1690 }
1691
1692 void TOIBREP::calcullevelsetdeuxiemepasse(vector<TOIBREP_POINT*> *lst)
1693 {
1694 LISTE_FEM_NOEUD::iterator itno;
1695 for (FEM_NOEUD* no=mai->get_premier_noeud(itno);no!=NULL;no=mai->get_suivant_noeud(itno))
1696 if (no->get_solution()<1e250)
1697 {
1698 TOIBREP_POINT* pt=(*lst)[no->get_numero()];
1699 MG_FACE* face=pt->get_mg_face();
1700 double xyz[3],uv[2];
1701 double dist=calcul_distance(no,face,pt,xyz,uv);
1702 int signe=1;
1703 if (no->get_solution()<0) signe=-1;
1704 no->change_solution(signe*dist);
1705 }
1706
1707
1708
1709
1710 }
1711
1712
1713
1714 double TOIBREP::calcul_distance(FEM_NOEUD* noeud,MG_ARETE* are,TOIBREP_POINT* pt,double &tii,double *xyz,double precision)
1715 {
1716 double eps;
1717 are->inverser(tii,noeud->get_coord());
1718 int compteur=0;
1719 OT_VECTEUR_3D Pt(noeud->get_x(),noeud->get_y(),noeud->get_z());
1720 do
1721 {
1722 compteur++;
1723 double ti=tii;
1724 double xyz[3],dxyz[3],ddxyz[3];
1725 are->deriver_seconde(ti,ddxyz,dxyz,xyz);
1726 OT_VECTEUR_3D Ct(xyz[0],xyz[1],xyz[2]);
1727 OT_VECTEUR_3D Ct_deriver(dxyz[0],dxyz[1],dxyz[2]);
1728 OT_VECTEUR_3D Ct_deriver_seconde(ddxyz[0],ddxyz[1],ddxyz[2]);
1729 OT_VECTEUR_3D Distance = Ct-Pt;
1730 tii=ti-Ct_deriver*Distance/(Ct_deriver_seconde*Distance+Ct_deriver.get_longueur2());
1731 eps=fabs(tii-ti);
1732 if (compteur>500) return 1e300;
1733 if (tii<are->get_tmin())
1734 {
1735 tii=are->get_tmin();
1736 eps=0.;
1737 }
1738 if (tii>are->get_tmax())
1739 {
1740 tii=are->get_tmax();
1741 eps=0.;
1742 }
1743 }
1744 while (eps>precision);
1745 are->evaluer(tii,xyz);
1746 OT_VECTEUR_3D Ct(xyz[0],xyz[1],xyz[2]);
1747 double distance=(Ct-Pt).get_longueur();
1748 return distance;
1749 }
1750
1751
1752 double TOIBREP::calcul_distance_level_ortho(FEM_NOEUD* no,MG_ARETE* are,TOIBREP_POINT* pt,double precision)
1753 {
1754 double t;
1755 double xyz[3];
1756 return calcul_distance_level_ortho(no,are,pt,t,xyz,precision);
1757 }
1758
1759 double TOIBREP::calcul_distance_level_ortho(FEM_NOEUD* no,MG_ARETE* are,TOIBREP_POINT* pt,double &t,double *xyz,double precision)
1760 {
1761 calcul_distance(no,are,pt,t,xyz,precision);
1762 double dir[3];
1763 are->deriver(t,dir);
1764 double uv[2];
1765 MG_FACE* face=are->get_mg_coarete(0)->get_boucle()->get_mg_face();
1766 face->inverser(uv,xyz);
1767 double nor[3];
1768 face->calcul_normale_unitaire(uv,nor);
1769 OT_VECTEUR_3D dirv(dir);
1770 OT_VECTEUR_3D norv(nor);
1771 OT_VECTEUR_3D sensv=norv&dirv;
1772 double d=-(sensv.get_x()*xyz[0]+sensv.get_y()*xyz[1],sensv.get_z()*xyz[2]);
1773 double dist=fabs(sensv.get_x()*no->get_x()+sensv.get_y()*no->get_y()+sensv.get_z()*no->get_z()+d);
1774 OT_VECTEUR_3D distv(no->get_x()-xyz[0],no->get_y()-xyz[1],no->get_z()-xyz[2]);
1775 if (sensv*distv<0.) dist=-dist;
1776 return dist;
1777 }
1778
1779
1780 double TOIBREP::calcul_distance(FEM_NOEUD* noeud,MG_FACE* face,TOIBREP_POINT* pt,double *xyz,double *uv,double precision)
1781 {
1782 double uvii[2],eps;
1783 pt->get_coord2(uvii);
1784 int compteur=0;
1785 OT_VECTEUR_3D Pt(noeud->get_x(),noeud->get_y(),noeud->get_z());
1786 double delta_u,delta_v;
1787 do
1788 {
1789 compteur++;
1790 double uvi[2];
1791 uvi[0]=uvii[0];
1792 uvi[1]=uvii[1];
1793 double xyzduu[3],xyzdvv[3],xyzduv[3],xyzdu[3],xyzdv[3],xyz[3];
1794 face->deriver_seconde(uvi,xyzduu,xyzduv,xyzdvv,xyz,xyzdu,xyzdv);
1795 OT_VECTEUR_3D S(xyz[0],xyz[1],xyz[2]);
1796 OT_VECTEUR_3D Su(xyzdu[0],xyzdu[1],xyzdu[2]);
1797 OT_VECTEUR_3D Sv(xyzdv[0],xyzdv[1],xyzdv[2]);
1798 OT_VECTEUR_3D Suu(xyzduu[0],xyzduu[1],xyzduu[2]);
1799 OT_VECTEUR_3D Suv(xyzduv[0],xyzduv[1],xyzduv[2]);
1800 OT_VECTEUR_3D Svv(xyzdvv[0],xyzdvv[1],xyzdvv[2]);
1801 OT_VECTEUR_3D Distance = S-Pt;
1802 double a[4],b[2];
1803 a[0]=Su.get_longueur2()+Distance*Suu;
1804 a[1]=Su*Sv+Distance*Suv;
1805 a[2]=Su*Sv+Distance*Suv;
1806 a[3]=Sv.get_longueur2()+Distance*Svv;
1807 b[0]=Distance*Su;b[0]=-b[0];
1808 b[1]=Distance*Sv;b[1]=-b[1];
1809 double deltau,deltav;
1810 double denominateur_delta=(a[0]*a[3]-a[2]*a[1]);
1811 if (a[0]<1E-12)
1812 deltau=0;
1813 else delta_u=(b[0]*a[3]-b[1]*a[1])/denominateur_delta;
1814 if (a[3]<1E-12)
1815 deltav=0;
1816 else delta_v=(a[0]*b[1]-a[2]*b[0])/denominateur_delta;
1817 /*if (fabs(denominateur_delta) < ( (fabs(a[0])+fabs(a[1])+fabs(a[2])+fabs(a[3]))*1e-12 ) )
1818 return 1e300;*/
1819 uvii[0]=uvi[0]+delta_u;
1820 uvii[1]=uvi[1]+delta_v;
1821 if (face->get_surface()->est_periodique_u()==1)
1822 {
1823 if(uvii[0]<0.) uvii[0]=face->get_surface()->get_periode_u()-uvii[0];
1824 if(uvii[0]>face->get_surface()->get_periode_u()) uvii[0]=uvii[0]-face->get_surface()->get_periode_u();
1825 }
1826 if (face->get_surface()->est_periodique_v()==1)
1827 {
1828 if(uvii[1]<0.) uvii[0]=face->get_surface()->get_periode_v()-uvii[1];
1829 if(uvii[1]>face->get_surface()->get_periode_v()) uvii[1]=uvii[1]-face->get_surface()->get_periode_v();
1830 }
1831 delta_u=uvii[0]-uvi[0];
1832 delta_v=uvii[1]-uvi[1];
1833 if (compteur>500) return 1e300;
1834 }
1835
1836 while ((fabs(delta_u)>precision)||(fabs(delta_v)>precision));
1837 face->evaluer(uvii,xyz);
1838 OT_VECTEUR_3D S(xyz[0],xyz[1],xyz[2]);
1839 double distance=(S-Pt).get_longueur();
1840 uv[0]=uvii[0];
1841 uv[1]=uvii[1];
1842 return distance;
1843 }
1844
1845
1846
1847 void TOIBREP::etendrelevelset(FEM_SOLUTION* sol,int numsol)
1848 {
1849 sol->active_solution(numsol);
1850
1851
1852 LISTE_FM know;
1853 LISTE_FM trial;
1854 LISTE_FM far;
1855 LISTE_FM exterieur;
1856 LISTE_FM_TRI trialtri;
1857 LISTE_FM_TRI_ID trialtriid;
1858
1859
1860 LISTE_FEM_ELEMENT3::iterator ittet;
1861 for (FEM_ELEMENT3* tet=mai->get_premier_element3(ittet);tet!=NULL;tet=mai->get_suivant_element3(ittet))
1862 {
1863 tet->change_solution(0.);
1864 int numsol=0;
1865 if (tet->get_fem_noeud(0)->get_solution()<1e200) {numsol++;tet->get_fem_noeud(0)->change_numero(1);} else tet->get_fem_noeud(0)->change_numero(0);
1866 if (tet->get_fem_noeud(1)->get_solution()<1e200) {numsol++;tet->get_fem_noeud(1)->change_numero(1);} else tet->get_fem_noeud(1)->change_numero(0);
1867 if (tet->get_fem_noeud(2)->get_solution()<1e200) {numsol++;tet->get_fem_noeud(2)->change_numero(1);} else tet->get_fem_noeud(2)->change_numero(0);
1868 if (tet->get_fem_noeud(3)->get_solution()<1e200) {numsol++;tet->get_fem_noeud(3)->change_numero(1);} else tet->get_fem_noeud(3)->change_numero(0);
1869 if (numsol==4)
1870 ajouter_liste(know,tet);
1871
1872 else if (numsol==3)
1873 {
1874 if (tet->get_fem_noeud(0)->get_numero()==0) tet->change_numero(0);
1875 else if (tet->get_fem_noeud(1)->get_numero()==0) tet->change_numero(1);
1876 else if (tet->get_fem_noeud(2)->get_numero()==0) tet->change_numero(2);
1877 else tet->change_numero(3);
1878 ajouter_liste(trial,tet);
1879 }
1880 else
1881 ajouter_liste(far,tet);
1882
1883 }
1884 for (LISTE_FM::iterator i=trial.begin();i!=trial.end();i++)
1885 {
1886 FEM_ELEMENT3* tet=*i;
1887 int signe;
1888 double sol=resoudgradT(tet,&signe);
1889 if (fabs(sol)>0.00000001)
1890 {
1891 if (fabs(sol)<fabs(tet->get_fem_noeud(tet->get_numero())->get_solution()))
1892 {
1893 tet->get_fem_noeud(tet->get_numero())->change_solution(sol);
1894 ajouter_liste(trialtri,trialtriid,tet,fabs(tet->get_fem_noeud(tet->get_numero())->get_solution()));
1895 }
1896 }
1897 else
1898 {
1899 ajouter_liste(exterieur,tet);
1900 tet->change_solution(1e300);
1901 }
1902 }
1903 int fin=0;
1904 LISTE_FM_TRI::iterator itfin=trialtri.end();
1905 itfin--;
1906 double longref=(*itfin).first;
1907 do
1908 {
1909 LISTE_FM_TRI::iterator it=trialtri.begin();
1910 FEM_ELEMENT3* tet=(*it).second;
1911 double longcourant=(*it).first;
1912 supprimer_liste(trialtri,trialtriid,tet);
1913 ajouter_liste(know,tet);
1914 FEM_NOEUD* noeud=tet->get_fem_noeud(tet->get_numero());
1915 noeud->change_numero(1);
1916 if (noeud->get_solution()>20000)
1917 cout << "BUGGGGGGG" <<endl;
1918 int nbtetra=noeud->get_lien_element3()->get_nb();
1919 for (int i=0;i<nbtetra;i++)
1920 {
1921 FEM_ELEMENT3* tet2=noeud->get_lien_element3()->get(i);
1922 if (tet2==tet) continue;
1923 LISTE_FM_TRI_ID::iterator it=trialtriid.find(tet2->get_id());
1924 if (it!=trialtriid.end())
1925 {
1926 int signe;
1927 double sol=resoudgradT(tet2,&signe);
1928 double solution=tet2->get_fem_noeud(tet2->get_numero())->get_solution();
1929 if (fabs(sol)>0.00000001)
1930 if (!((solution<1e200)&&(sol*solution<0)))
1931 if (fabs(sol)<fabs(solution))
1932 {
1933 supprimer_liste(trialtri,trialtriid,tet2);
1934 ajouter_liste(trialtri,trialtriid,tet2,fabs(sol));
1935 tet2->get_fem_noeud(tet2->get_numero())->change_solution(sol);
1936 }
1937 }
1938 LISTE_FM::iterator it2=find(far.begin(),far.end(),tet2);
1939 if (it2!=far.end())
1940 {
1941 int numsol=0;
1942 if (tet2->get_fem_noeud(0)->get_numero()==1) numsol++;
1943 if (tet2->get_fem_noeud(1)->get_numero()==1) numsol++;
1944 if (tet2->get_fem_noeud(2)->get_numero()==1) numsol++;
1945 if (tet2->get_fem_noeud(3)->get_numero()==1) numsol++;
1946 //if (numsol==4)
1947 //cout << " BUG " <<endl;
1948 if (numsol==3)
1949 {
1950 if (tet2->get_fem_noeud(0)->get_numero()==0) tet2->change_numero(0);
1951 else if (tet2->get_fem_noeud(1)->get_numero()==0) tet2->change_numero(1);
1952 else if (tet2->get_fem_noeud(2)->get_numero()==0) tet2->change_numero(2);
1953 else tet2->change_numero(3);
1954 int signe;
1955 double sol=resoudgradT(tet2,&signe);
1956 double ancsol=tet2->get_fem_noeud(tet2->get_numero())->get_solution();
1957 if (fabs(sol)>0.00000001)
1958 {
1959 if (!((ancsol<1e200) && (ancsol*sol<0.) ))
1960 {
1961 tet2->get_fem_noeud(tet2->get_numero())->change_solution(sol);
1962 supprimer_liste(far,tet2);
1963 ajouter_liste(trialtri,trialtriid,tet2,fabs(sol));
1964 }
1965 }
1966 else
1967 {
1968 tet2->change_solution(1e300);
1969 ajouter_liste(exterieur,tet2);
1970 }
1971 }
1972 }
1973 }
1974 if (trialtri.size()==0) fin=1;
1975 if (exterieur.size()>0)
1976 if (fin==0)
1977 if (longcourant>longref)
1978 {
1979 int nombre=exterieur.size();
1980 for (int i=0;i<nombre;i++)
1981 {
1982 FEM_ELEMENT3* tet2=(*(exterieur.begin()));
1983 supprimer_liste(exterieur,tet2);
1984 ajouter_liste(know,tet2);
1985 for (int nd=0;nd<4;nd++)
1986 {
1987 FEM_NOEUD* noeud=tet2->get_fem_noeud(nd);
1988 int nbtetra=noeud->get_lien_element3()->get_nb();
1989 for (int i=0;i<nbtetra;i++)
1990 {
1991 FEM_ELEMENT3* tet3=noeud->get_lien_element3()->get(i);
1992 if (tet2==tet3) continue;
1993 LISTE_FM::iterator it2=find(far.begin(),far.end(),tet3);
1994 if (it2!=far.end())
1995 {
1996 supprimer_liste(far,tet3);
1997 ajouter_liste(exterieur,tet3);
1998 tet3->change_solution(1e300);
1999 }
2000 }
2001 }
2002 }
2003 LISTE_FM_TRI::iterator itfin=trialtri.end();
2004 itfin--;
2005 longref=(*itfin).first;
2006 }
2007 }
2008 while (fin==0);
2009 LISTE_FEM_NOEUD::iterator itnoeud;
2010 for (FEM_NOEUD* noeud=mai->get_premier_noeud(itnoeud);noeud!=NULL;noeud=mai->get_suivant_noeud(itnoeud))
2011 noeud->change_numero(0);
2012 for (FEM_ELEMENT3* tet=mai->get_premier_element3(ittet);tet!=NULL;tet=mai->get_suivant_element3(ittet))
2013 {
2014 if (tet->get_solution()>1e200) continue;
2015 tet->get_fem_noeud(0)->change_numero(1);
2016 tet->get_fem_noeud(1)->change_numero(1);
2017 tet->get_fem_noeud(2)->change_numero(1);
2018 tet->get_fem_noeud(3)->change_numero(1);
2019 }
2020 int i=0;
2021 for (FEM_NOEUD* noeud=mai->get_premier_noeud(itnoeud);noeud!=NULL;noeud=mai->get_suivant_noeud(itnoeud))
2022 {
2023 if (noeud->get_numero()==1) sol->ecrire(noeud->get_solution(),i,numsol); else sol->ecrire(1e300,i,numsol);
2024 ++i;
2025 }
2026 }
2027 IBrep TOIBREP::exporter_IBrep(string chemin,FEM_SOLUTION* solution,FEM_SOLUTION *solution_ele,MG_GROUPE_TOPOLOGIQUE* mggt)
2028 {
2029 TPL_MAP_ENTITE<MG_VOLUME*> lst;
2030 if (mggt==NULL)
2031 {
2032 int nbvol=geo->get_nb_mg_volume();
2033 for (int i=0;i<nbvol;i++)
2034 lst.ajouter(geo->get_mg_volume(i));
2035 }
2036 else
2037 {
2038 int nbmggt=mggt->get_nb();
2039 for (int i=0;i<nbmggt;i++)
2040 if (mggt->get(i)->get_dimension()==3)
2041 lst.ajouter((MG_VOLUME*)mggt->get(i));
2042 }
2043 IBrep brep(100);
2044 int nbvolexp=lst.get_nb();
2045 for (int i=0;i<nbvolexp;i++)
2046 {
2047 MG_VOLUME* vol=lst.get(i);
2048 int nbcoq=vol->get_nb_mg_coquille();
2049 IVolumeN ivoltmp(vol->get_id());
2050 pair<IVolume*,bool> pair_ivol=brep.AddVolume(ivoltmp);
2051 if (vol->get_idoriginal()!="") brep.SetName(pair_ivol.first,vol->get_idoriginal());
2052 IVolume* ivol=pair_ivol.first;
2053 for (int j=0;j<nbcoq;j++)
2054 {
2055 MG_COQUILLE* coq=vol->get_mg_coquille(j);
2056 int nbface=coq->get_nb_mg_coface();
2057 IShell ishell(nbface);
2058 for (int k=0;k<nbface;k++)
2059 {
2060 MG_COFACE* coface=coq->get_mg_coface(k);
2061 ishell[k]=coface->get_id();
2062 MG_FACE* face=coface->get_face();
2063 int sens=coface->get_orientation();
2064 ICoFaceN icoface(coface->get_id(),face->get_id(),sens);
2065 brep.AddCoFace(icoface);
2066 IFace* iface=brep.GetFace(face->get_id());
2067 if (iface==NULL)
2068 {
2069 IFaceN ifacenew(face->get_id());
2070 pair<IFace*,bool> pair_iface=brep.AddFace(ifacenew);
2071 if (face->get_idoriginal()!="") brep.SetName(pair_iface.first,face->get_idoriginal());
2072 iface=pair_iface.first;
2073 int nbbou=face->get_nb_mg_boucle();
2074 for (int l=0;l<nbbou;l++)
2075 {
2076 MG_BOUCLE* bou=face->get_mg_boucle(l);
2077 int nbare=bou->get_nb_mg_coarete();
2078 ILoop iloop(nbare);
2079 for (int m=0;m<nbare;m++)
2080 {
2081 MG_COARETE* coare=bou->get_mg_coarete(m);
2082 iloop[m]=coare->get_id();
2083 MG_ARETE* are=coare->get_arete();
2084 int sens=coare->get_orientation();
2085 ICoEdgeN icoedge(coare->get_id(),are->get_id(),sens,face->get_id());
2086 brep.AddCoEdge(icoedge);
2087 IEdge* iedge=brep.GetEdge(are->get_id());
2088 IVertex *ivertex1,*ivertex2;
2089 ICoVertex *icover1,*icover2;
2090 if (iedge==NULL)
2091 {
2092 MG_COSOMMET* cover1=are->get_cosommet1();
2093 MG_COSOMMET* cover2=are->get_cosommet2();
2094 MG_SOMMET* ver1=cover1->get_sommet();
2095 MG_SOMMET* ver2=cover2->get_sommet();
2096 ICoVertexN icovertmp1(cover1->get_id(),are->get_id(),ver1->get_id(),cover1->get_t());
2097 ICoVertexN icovertmp2(cover2->get_id(),are->get_id(),ver2->get_id(),cover2->get_t());
2098 pair<ICoVertex*,bool> pair_icover1=brep.AddCoVertex(icovertmp1);
2099 pair<ICoVertex*,bool> pair_icover2=brep.AddCoVertex(icovertmp2);
2100 icover1=pair_icover1.first;
2101 icover2=pair_icover2.first;
2102 IEdgeN iedgetmp(are->get_id(),cover1->get_id(),cover2->get_id());
2103 ivertex1=brep.GetVertex(ver1->get_id());
2104 ivertex2=brep.GetVertex(ver2->get_id());
2105 if (ivertex1==NULL)
2106 {
2107 MG_POINT* pt=ver1->get_point();
2108 double xyz[3];
2109 pt->evaluer(xyz);
2110 IVertexN ivertex(ver1->get_id(),xyz);
2111 pair<IVertex*,bool> pair_ivertex1=brep.AddVertex(ivertex);
2112 if (ver1->get_idoriginal()!="") brep.SetName(pair_ivertex1.first,ver1->get_idoriginal());
2113 ivertex1=pair_ivertex1.first;
2114 }
2115 if (ivertex2==NULL)
2116 {
2117 MG_POINT* pt=ver2->get_point();
2118 double xyz[3];
2119 pt->evaluer(xyz);
2120 IVertexN ivertex(ver2->get_id(),xyz);
2121 pair<IVertex*,bool> pair_ivertex2=brep.AddVertex(ivertex);
2122 if (ver2->get_idoriginal()!="") brep.SetName(pair_ivertex2.first,ver2->get_idoriginal());
2123 ivertex2=pair_ivertex2.first;
2124 }
2125 ivertex1->AddCoVertex(cover1->get_id());
2126 ivertex2->AddCoVertex(cover2->get_id());
2127 pair<IEdge*,bool> pair_iedge=brep.AddEdge(iedgetmp);
2128 if (are->get_idoriginal()!="") brep.SetName(pair_iedge.first,are->get_idoriginal());
2129 iedge=pair_iedge.first;
2130 }
2131 iedge->AddCoEdge(coare->get_id(),brep);
2132 if (sens==1)
2133 {
2134 icover1=brep.GetCoVertex(iedge->FromCoVertex());
2135 ivertex1=brep.GetVertex(icover1->Vertex());
2136 ivertex1->AddFace(face->get_id());
2137 }
2138 else
2139 {
2140 icover2=brep.GetCoVertex(iedge->ToCoVertex());
2141 ivertex2=brep.GetVertex(icover2->Vertex());
2142 ivertex2->AddFace(face->get_id());
2143 }
2144 }
2145 iface->AddLoop(iloop);
2146 }
2147 }
2148 iface->AddCoFace(coface->get_id());
2149 }
2150 ivol->AddShell(ishell);
2151 }
2152 }
2153 int nbsol=solution->get_nb_champ();
2154 //unsigned long *correspondface=new unsigned long[nbsol];
2155 for (int i=0;i<nbsol;i++)
2156 {
2157 std::string nom=solution->get_legende(i);
2158 char nom2[2];
2159 unsigned long id;
2160 sscanf(nom.c_str(),"%s %lu",nom2,&id);
2161 std::pair<IField *,bool> fld=brep.AddField(id);
2162 if (nom2[0]!='F')
2163 {
2164 IField *f=fld.first;
2165 f->info.tag=1;
2166 }
2167 }
2168 LISTE_FEM_NOEUD::iterator itnoeud;
2169 int i=0;
2170 for (FEM_NOEUD* noeud=mai->get_premier_noeud(itnoeud);noeud!=NULL;noeud=mai->get_suivant_noeud(itnoeud))
2171 {
2172 int nbsolnoeud=0;
2173 for (int j=0;j<nbsol;j++)
2174 {
2175 if (solution->lire(i,j)<1e200) nbsolnoeud++;
2176 }
2177 double *xyz=noeud->get_coord();
2178 INodeN inoeudtmp(noeud->get_id(),xyz[0],xyz[1],xyz[2],nbsolnoeud);
2179 pair<INode*,bool> pair_inoeud=brep.AddNode(inoeudtmp);
2180 INode* inoeud=pair_inoeud.first;
2181 int num=0;
2182 IBrep::iterator_fields itf=brep.begin_fields();
2183 for (int j=0;j<nbsol;j++)
2184 {
2185 if (solution->lire(i,j)<1e200)
2186 {
2187 inoeud->Fields()[num]=(*itf).num;
2188 inoeud->Values()[num]=solution->lire(i,j);
2189 num++;
2190 }
2191 itf++;
2192 }
2193 i++;
2194 }
2195 LISTE_FEM_ELEMENT3::iterator ittet;
2196 int num=0;
2197 i=0;
2198 for (FEM_ELEMENT3* tet=mai->get_premier_element3(ittet);tet!=NULL;tet=mai->get_suivant_element3(ittet))
2199 {
2200 int nbsolele=0;
2201 for (int j=0;j<nbsol;j++)
2202 {
2203 if (fabs(solution_ele->lire(i,j)-1.)<0.0000000001) nbsolele++;
2204 }
2205 IElementN xfemele(IElement::TETRAHEDRON,nbsolele);
2206 num++;
2207 xfemele.num=num;
2208 xfemele.GetNode(0)=tet->get_fem_noeud(0)->get_id();
2209 xfemele.GetNode(1)=tet->get_fem_noeud(1)->get_id();
2210 xfemele.GetNode(2)=tet->get_fem_noeud(2)->get_id();
2211 xfemele.GetNode(3)=tet->get_fem_noeud(3)->get_id();
2212 int num=0;
2213 IBrep::iterator_fields itf=brep.begin_fields();
2214 for (int j=0;j<nbsol;j++)
2215 {
2216 if (fabs(solution_ele->lire(i,j)-1.)<0.0000000001)
2217 {
2218 xfemele.Fields()[num]=(*itf).num;
2219 num++;
2220 }
2221 itf++;
2222 }
2223 brep.AddElement(xfemele);
2224 i++;
2225 }
2226
2227
2228
2229
2230 std::ofstream output(chemin.c_str());
2231 output << brep << std::endl;
2232 output.close();
2233
2234
2235
2236
2237 return brep;
2238 }
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287 int TOIBREP::intersection_segment_triangle(FEM_NOEUD* nos1,FEM_NOEUD* nos2,FEM_NOEUD* no1,FEM_NOEUD *no2,FEM_NOEUD *no3,double *uv,double *xyz)
2288 {
2289 OT_VECTEUR_3D ori(no1->get_coord());
2290 OT_VECTEUR_3D vec1(no1->get_coord(),no2->get_coord());
2291 OT_VECTEUR_3D vec2(no1->get_coord(),no3->get_coord());
2292 OT_VECTEUR_3D vecdir(nos1->get_coord(),nos2->get_coord());
2293 OT_VECTEUR_3D moinsvecdir=(-1.)*vecdir;
2294 OT_VECTEUR_3D f(no1->get_coord(),nos1->get_coord());
2295 OT_MATRICE_3D A(vec1,vec2,moinsvecdir);
2296 OT_MATRICE_3D Bu(f,vec2,moinsvecdir);
2297 OT_MATRICE_3D Bv(vec1,f,moinsvecdir);
2298 OT_MATRICE_3D Bt(vec1,vec2,f);
2299 double det=A.get_determinant();
2300 if (fabs(det)<1e-10) return 0;
2301 uv[0]=Bu.get_determinant()/det;
2302 uv[1]=Bv.get_determinant()/det;
2303 uv[2]=Bt.get_determinant()/det;
2304 if (uv[2]<1e-10) return 0;
2305 if (uv[2]>1.-1e-10) return 0;
2306 if (uv[0]<-1e-10) return 0;
2307 if (uv[0]>1+1e-10) return 0;
2308 if (uv[1]<-1e-10) return 0;
2309 if (uv[1]>1+1e-10) return 0;
2310 if (uv[0]+uv[1]<-1e-10) return 0;
2311 if (uv[0]+uv[1]>1+1e-10) return 0;
2312 xyz[0]=(nos1->get_coord())[0]+uv[2]*vecdir.get_x();
2313 xyz[1]=(nos1->get_coord())[1]+uv[2]*vecdir.get_y();
2314 xyz[2]=(nos1->get_coord())[2]+uv[2]*vecdir.get_z();
2315 return 1;
2316 }
2317
2318
2319 int TOIBREP::intersection_arete_triangle(MG_ARETE* are,FEM_NOEUD* no1,FEM_NOEUD *no2,FEM_NOEUD *no3,double *uv,double *xyz)
2320 {
2321 OT_VECTEUR_3D ori(no1->get_coord());
2322 OT_VECTEUR_3D vec1(no1->get_coord(),no2->get_coord());
2323 OT_VECTEUR_3D vec2(no1->get_coord(),no3->get_coord());
2324 uv[0]=0.;
2325 uv[1]=0.;
2326 double tdep=uv[2];
2327 if (uv[2]>are->get_tmax()) return 0;
2328 double titer=are->get_tmax()-tdep;
2329 int ok=0;
2330 int nbiter=0;
2331 do
2332 {
2333 nbiter++;
2334 if (nbiter>40) ok=2;
2335 double arexyz[3],darexyz[3];
2336 are->evaluer(uv[2],arexyz);
2337 are->deriver(uv[2],darexyz);
2338 double f1=ori.get_x()+uv[0]*vec1.get_x()+uv[1]*vec2.get_x()-arexyz[0];
2339 double f2=ori.get_y()+uv[0]*vec1.get_y()+uv[1]*vec2.get_y()-arexyz[1];
2340 double f3=ori.get_z()+uv[0]*vec1.get_z()+uv[1]*vec2.get_z()-arexyz[2];
2341 OT_VECTEUR_3D vecdare(darexyz);
2342 vecdare=(-1.)*vecdare;
2343 OT_VECTEUR_3D f(-f1,-f2,-f3);
2344 OT_MATRICE_3D A(vec1,vec2,vecdare);
2345 OT_MATRICE_3D Bu(f,vec2,vecdare);
2346 OT_MATRICE_3D Bv(vec1,f,vecdare);
2347 OT_MATRICE_3D Bt(vec1,vec2,f);
2348 double det=A.get_determinant();
2349 if (fabs(det)<1e-10)
2350 {
2351 if (nbiter==1)
2352 {
2353 uv[2]=tdep+0.05*titer;
2354 continue;
2355 }
2356 else ok=2;
2357 }
2358 double du=Bu.get_determinant()/det;
2359 double dv=Bv.get_determinant()/det;
2360 double dt=Bt.get_determinant()/det;
2361 uv[0]=uv[0]+du;
2362 uv[1]=uv[1]+dv;
2363 uv[2]=uv[2]+dt;
2364 if (are->get_courbe()->est_periodique())
2365 if (uv[2]<are->get_tmin()) uv[2]=uv[2]+are->get_courbe()->get_periode();
2366 if (fabs(du)<1e-11)
2367 if (fabs(dv)<1e-11)
2368 if (fabs(dt)<1e-11) ok=1;
2369 }
2370 while (ok==0);
2371 //if (ok==2) {uv[2]=tdep+0.1;return intersection_arete_triangle(are,no1,no2,no3,uv,xyz);}
2372 if (ok==2) return 0;
2373 if (uv[2]<tdep+1e-10) return 0;
2374 if (uv[2]>are->get_tmax()-1e-10) return 0;
2375 if (uv[0]<-1e-10) return 0;
2376 if (uv[0]>1+1e-10) return 0;
2377 if (uv[1]<-1e-10) return 0;
2378 if (uv[1]>1+1e-10) return 0;
2379 if (uv[0]+uv[1]<-1e-10) return 0;
2380 if (uv[0]+uv[1]>1+1e-10) return 0;
2381 are->evaluer(uv[2],xyz);
2382 return 1;
2383 }
2384
2385 void TOIBREP::decoupe_element2_par_element1et0(FEM_ELEMENT3* ele,TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*> *lstentitetopo)
2386 {
2387 TPL_MAP_ENTITE<FEM_NOEUD*> lst;
2388 int nb=ele->get_nb_xfem(0);
2389 for (int i=0;i<nb;i++)
2390 if (lstentitetopo->existe(ele->get_xfem(0,i)->get_lien_topologie()))
2391 lst.ajouter(((XFEM_ELEMENT0*)ele->get_xfem(0,i))->get_fem_noeud(0));
2392 nb=ele->get_nb_xfem(1);
2393 for (int i=0;i<nb;i++)
2394 if (lstentitetopo->existe(ele->get_xfem(1,i)->get_lien_topologie()))
2395 {
2396 lst.ajouter(((XFEM_ELEMENT1*)ele->get_xfem(1,i))->get_fem_noeud(0));
2397 lst.ajouter(((XFEM_ELEMENT1*)ele->get_xfem(1,i))->get_fem_noeud(1));
2398 }
2399 TPL_MAP_ENTITE<FEM_NOEUD*>::ITERATEUR it;
2400 for (FEM_NOEUD* no=lst.get_premier(it);no!=NULL;no=lst.get_suivant(it))
2401 decoupe_element2(ele,no);
2402
2403 }
2404
2405 int TOIBREP::decoupe_element2(FEM_ELEMENT3* ele,FEM_NOEUD* no)
2406 {
2407 TPL_LISTE_ENTITE<XFEM_ELEMENT2*> lst;
2408 int nb=ele->get_nb_xfem(2);
2409 for (int i=0;i<nb;i++)
2410 lst.ajouter((XFEM_ELEMENT2*)ele->get_xfem(2,i));
2411 for (int i=0;i<nb;i++)
2412 decoupe_element(lst.get(i),no);
2413
2414 }
2415
2416 int TOIBREP::decoupe_element(XFEM_ELEMENT2 *ele,FEM_NOEUD* no)
2417 {
2418 if (no->get_id()==598016)
2419 std::cout << std::endl;
2420 if (ele->get_lien_topologie()->est_topologie_sousjacente(no->get_lien_topologie())==0) return 0;
2421 int status=outilfem.projeteestdansletriangle(ele,no->get_x(),no->get_y(),no->get_z());
2422 if (status==0) return 0;
2423 int arete1=outilfem.compare_etat_triangle(status,FEM_MAILLAGE_OUTILS::ARETE1);
2424 int arete2=outilfem.compare_etat_triangle(status,FEM_MAILLAGE_OUTILS::ARETE2);
2425 int arete3=outilfem.compare_etat_triangle(status,FEM_MAILLAGE_OUTILS::ARETE3);
2426 int aretetot=arete1+arete2+arete3;
2427 if (aretetot==2)
2428 return 0;
2429 FEM_NOEUD *lstno[3];
2430 if (arete1==0)
2431 {
2432 lstno[0]=ele->get_fem_noeud(0);
2433 lstno[1]=no;
2434 lstno[2]=ele->get_fem_noeud(1);
2435 /*
2436 XFEM_TRIANGLE3 *xtri=new XFEM_TRIANGLE3(ele->get_fem_element_maillage(),ele->get_lien_topologie(),lstno);
2437 mai->ajouter_xfem_element2(xtri);
2438 oriente_tri(xtri,(MG_FACE*)ele->get_lien_topologie());*/
2439 XFEM_TRIANGLE3 *xtri=inserer_xtriangle(ele->get_fem_element_maillage(),(MG_FACE*)ele->get_lien_topologie(),lstno);
2440 if (xtri!=NULL)
2441 {
2442 xtri->change_etat(ele->get_etat());
2443 ele->get_fem_element_maillage()->change_etat(0,FRONTIERE);
2444 }
2445 }
2446 if (arete2==0)
2447 {
2448 lstno[0]=ele->get_fem_noeud(1);
2449 lstno[1]=no;
2450 lstno[2]=ele->get_fem_noeud(2);
2451 //XFEM_TRIANGLE3 *xtri=new XFEM_TRIANGLE3(ele->get_fem_element_maillage(),ele->get_lien_topologie(),lstno);
2452 //mai->ajouter_xfem_element2(xtri);
2453 //oriente_tri(xtri,(MG_FACE*)ele->get_lien_topologie());
2454 //xtri->change_etat(ele->get_etat());
2455 //ele->get_fem_element_maillage()->change_etat(0,FRONTIERE);
2456 XFEM_TRIANGLE3 *xtri=inserer_xtriangle(ele->get_fem_element_maillage(),(MG_FACE*)ele->get_lien_topologie(),lstno);
2457 if (xtri!=NULL)
2458 {
2459 xtri->change_etat(ele->get_etat());
2460 ele->get_fem_element_maillage()->change_etat(0,FRONTIERE);
2461 }
2462 }
2463 if (arete3==0)
2464 {
2465 lstno[0]=ele->get_fem_noeud(2);
2466 lstno[1]=no;
2467 lstno[2]=ele->get_fem_noeud(0);
2468 //XFEM_TRIANGLE3 *xtri=new XFEM_TRIANGLE3(ele->get_fem_element_maillage(),ele->get_lien_topologie(),lstno);
2469 //mai->ajouter_xfem_element2(xtri);
2470 //oriente_tri(xtri,(MG_FACE*)ele->get_lien_topologie());
2471 //xtri->change_etat(ele->get_etat());
2472 //ele->get_fem_element_maillage()->change_etat(0,FRONTIERE);
2473 XFEM_TRIANGLE3 *xtri=inserer_xtriangle(ele->get_fem_element_maillage(),(MG_FACE*)ele->get_lien_topologie(),lstno);
2474 if (xtri!=NULL)
2475 {
2476 xtri->change_etat(ele->get_etat());
2477 ele->get_fem_element_maillage()->change_etat(0,FRONTIERE);
2478 }
2479 }
2480 mai->supprimer_xfem_element2id(ele->get_id());
2481 return 1;
2482 }
2483
2484
2485
2486 int TOIBREP::decoupe_element(int status,FEM_ELEMENT3 *ele,FEM_NOEUD* no,FEM_NOEUD* no1,FEM_NOEUD* no2,FEM_NOEUD* no3,FEM_NOEUD* no4)
2487 {
2488 int face1=outilfem.compare_etat_tetra(status,FEM_MAILLAGE_OUTILS::FACE1);
2489 int face2=outilfem.compare_etat_tetra(status,FEM_MAILLAGE_OUTILS::FACE2);
2490 int face3=outilfem.compare_etat_tetra(status,FEM_MAILLAGE_OUTILS::FACE3);
2491 int face4=outilfem.compare_etat_tetra(status,FEM_MAILLAGE_OUTILS::FACE4);
2492 int facetot=face1+face2+face3+face4;
2493 if (facetot==3)
2494 return 0;
2495 FEM_NOEUD *lstno[4];
2496 if (face3==0)
2497 {
2498 lstno[0]=no1;
2499 lstno[1]=no;
2500 lstno[2]=no3;
2501 lstno[3]=no4;
2502 XFEM_TETRA4* xtet1=new XFEM_TETRA4(ele,ele->get_lien_topologie(),lstno);
2503 mai->ajouter_xfem_element3(xtet1);
2504 xtet1->change_etat(XINCONNU);
2505 ele->change_etat(0,FRONTIERE);
2506 }
2507 if (face2==0)
2508 {
2509 lstno[0]=no1;
2510 lstno[1]=no2;
2511 lstno[2]=no;
2512 lstno[3]=no4;
2513 XFEM_TETRA4* xtet2=new XFEM_TETRA4(ele,ele->get_lien_topologie(),lstno);
2514 mai->ajouter_xfem_element3(xtet2);
2515 xtet2->change_etat(XINCONNU);
2516 ele->change_etat(0,FRONTIERE);
2517 }
2518 if (face1==0)
2519 {
2520 lstno[0]=no1;
2521 lstno[1]=no2;
2522 lstno[2]=no3;
2523 lstno[3]=no;
2524 XFEM_TETRA4* xtet3=new XFEM_TETRA4(ele,ele->get_lien_topologie(),lstno);
2525 mai->ajouter_xfem_element3(xtet3);
2526 xtet3->change_etat(XINCONNU);
2527 ele->change_etat(0,FRONTIERE);
2528 }
2529 if (face4==0)
2530 {
2531 lstno[0]=no;
2532 lstno[1]=no2;
2533 lstno[2]=no3;
2534 lstno[3]=no4;
2535 XFEM_TETRA4* xtet4=new XFEM_TETRA4(ele,ele->get_lien_topologie(),lstno);
2536 mai->ajouter_xfem_element3(xtet4);
2537 xtet4->change_etat(XINCONNU);
2538 ele->change_etat(0,FRONTIERE);
2539 }
2540 return 1;
2541 }
2542
2543
2544 void TOIBREP::decoupe_element(int status,FEM_NOEUD* no,FEM_ELEMENT3* ele)
2545 {
2546 double *xyz=no->get_coord();
2547 if (ele->get_nb_xfem(3)==0)
2548 decoupe_element(status,ele,no,ele->get_fem_noeud(0),ele->get_fem_noeud(1),ele->get_fem_noeud(2),ele->get_fem_noeud(3));
2549 else
2550 {
2551 int nb=ele->get_nb_xfem(3);
2552 for (int i=nb-1;i>-1;i--)
2553 {
2554 XFEM_ELEMENT3* xele3=(XFEM_ELEMENT3*)ele->get_xfem(3,i);
2555 int status=outilfem.estdansletetra(xele3,xyz[0],xyz[1],xyz[2]);
2556 if (outilfem.compare_etat_tetra(status,FEM_MAILLAGE_OUTILS::INTERIEUR)==1)
2557 {
2558 int res=decoupe_element(status,ele,no,xele3->get_fem_noeud(0),xele3->get_fem_noeud(1),xele3->get_fem_noeud(2),xele3->get_fem_noeud(3));
2559 if (res==1) mai->supprimer_xfem_element3id(xele3->get_id());
2560 }
2561
2562 }
2563 if (ele->verifie_validite_decoupage_xfem()==0)
2564 std::cout << "pb " << ele->get_id() << " " << nb <<"," << ele->get_nb_xfem(3) << " xfem" << std::endl;
2565
2566 }
2567 }
2568
2569 void TOIBREP::decoupe_element(XFEM_ELEMENT1* xseg,inter_ele_arete *ele_inter)
2570 {
2571 std::map<double,FEM_NOEUD*> lstnoeud;
2572 for (int i=0;i<ele_inter->ele->get_nb_xfem(3);i++)
2573 {
2574 XFEM_TETRA4* xtet=(XFEM_TETRA4*)ele_inter->ele->get_xfem(3,i);
2575 double xyz1[3],xyz2[3],xyz3[3],xyz4[3],uv1[3],uv2[3],uv3[3],uv4[3];
2576 int inter_face1=intersection_segment_triangle(xseg->get_fem_noeud(0),xseg->get_fem_noeud(1),xtet->get_fem_noeud(0),xtet->get_fem_noeud(1),xtet->get_fem_noeud(2),uv1,xyz1);
2577 int inter_face2=intersection_segment_triangle(xseg->get_fem_noeud(0),xseg->get_fem_noeud(1),xtet->get_fem_noeud(0),xtet->get_fem_noeud(1),xtet->get_fem_noeud(3),uv2,xyz2);
2578 int inter_face3=intersection_segment_triangle(xseg->get_fem_noeud(0),xseg->get_fem_noeud(1),xtet->get_fem_noeud(0),xtet->get_fem_noeud(2),xtet->get_fem_noeud(3),uv3,xyz3);
2579 int inter_face4=intersection_segment_triangle(xseg->get_fem_noeud(0),xseg->get_fem_noeud(1),xtet->get_fem_noeud(1),xtet->get_fem_noeud(2),xtet->get_fem_noeud(3),uv4,xyz4);
2580 if (inter_face1==1)
2581 {
2582 std::map<double,FEM_NOEUD*>::iterator it=lstnoeud.lower_bound(uv1[2]-1e-6);
2583 double l=0.;
2584 if (it!=lstnoeud.end())
2585 l=(uv1[2]-it->first)*(uv1[2]-it->first);
2586 if ((l>1e-10) || (it==lstnoeud.end()))
2587 {
2588 FEM_NOEUD* no=inserer_noeud(ele_inter->are,xyz1[0],xyz1[1],xyz1[2]);
2589 no->change_etat(0,FRONTIERE);
2590 std::pair<double,FEM_NOEUD*> tmp(uv1[2],no);
2591 lstnoeud.insert(tmp);
2592 }
2593 }
2594 if (inter_face2==1)
2595 {
2596 std::map<double,FEM_NOEUD*>::iterator it=lstnoeud.lower_bound(uv2[2]-1e-6);
2597 double l=0.;
2598 if (it!=lstnoeud.end())
2599 l=(uv2[2]-it->first)*(uv2[2]-it->first);
2600 if ((l>1e-10) || (it==lstnoeud.end()))
2601 {
2602 FEM_NOEUD* no=inserer_noeud(ele_inter->are,xyz2[0],xyz2[1],xyz2[2]);
2603 no->change_etat(0,FRONTIERE);
2604 std::pair<double,FEM_NOEUD*> tmp(uv2[2],no);
2605 lstnoeud.insert(tmp);
2606 }
2607 }
2608 if (inter_face1==3)
2609 {
2610 std::map<double,FEM_NOEUD*>::iterator it=lstnoeud.lower_bound(uv3[2]-1e-6);
2611 double l=0.;
2612 if (it!=lstnoeud.end())
2613 l=(uv3[2]-it->first)*(uv3[2]-it->first);
2614 if ((l>1e-10) || (it==lstnoeud.end()))
2615 {
2616 FEM_NOEUD* no=inserer_noeud(ele_inter->are,xyz3[0],xyz3[1],xyz3[2]);
2617 no->change_etat(0,FRONTIERE);
2618 std::pair<double,FEM_NOEUD*> tmp(uv3[2],no);
2619 lstnoeud.insert(tmp);
2620 }
2621 }
2622 if (inter_face4==1)
2623 {
2624 std::map<double,FEM_NOEUD*>::iterator it=lstnoeud.lower_bound(uv4[2]-1e-6);
2625 double l=0.;
2626 if (it!=lstnoeud.end())
2627 l=(uv4[2]-it->first)*(uv4[2]-it->first);
2628 if ((l>1e-10) || (it==lstnoeud.end()))
2629 {
2630 FEM_NOEUD* no=inserer_noeud(ele_inter->are,xyz4[0],xyz4[1],xyz4[2]);
2631 no->change_etat(0,FRONTIERE);
2632 std::pair<double,FEM_NOEUD*> tmp(uv4[2],no);
2633 lstnoeud.insert(tmp);
2634 }
2635 }
2636 }
2637 int nbnoeudcree=lstnoeud.size();
2638 for (std::map<double,FEM_NOEUD*>::iterator it=lstnoeud.begin();it!=lstnoeud.end();it++)
2639 decoupe_element(-1,it->second,ele_inter->ele);
2640 std::pair<double,FEM_NOEUD*> tmp(0.,xseg->get_fem_noeud(0));
2641 lstnoeud.insert(tmp);
2642 std::pair<double,FEM_NOEUD*> tmp2(1.,xseg->get_fem_noeud(1));
2643 lstnoeud.insert(tmp2);
2644 std::map<double,FEM_NOEUD*>::iterator it=lstnoeud.begin();
2645 std::map<double,FEM_NOEUD*>::iterator it2=lstnoeud.begin();
2646 it2++;
2647 for (int i=0;i<nbnoeudcree+1;i++)
2648 {
2649 FEM_NOEUD* tab[2];
2650 tab[0]=it->second;
2651 tab[1]=it2->second;
2652 XFEM_SEGMENT2* sxseg=new XFEM_SEGMENT2(ele_inter->ele,xseg->get_lien_topologie(),tab);
2653 mai->ajouter_xfem_element1(sxseg);
2654 sxseg->change_etat(XFRONTIERE);
2655 it++;
2656 it2++;
2657 OT_VECTEUR_3D vec(tab[0]->get_coord(),tab[1]->get_coord());
2658 if (vec.get_longueur()<1e-10)
2659 std::cout << " toto " << std::endl;
2660
2661 }
2662 mai->supprimer_xfem_element1id(xseg->get_id());
2663
2664
2665
2666
2667
2668
2669
2670 /*if (ele_inter->ele->get_nb_xfem(3)==0)
2671 {
2672 decoupe_element(ele_inter->status1,ele_inter->ele,ele_inter->no1,ele_inter->ele->get_fem_noeud(0),ele_inter->ele->get_fem_noeud(1),ele_inter->ele->get_fem_noeud(2),ele_inter->ele->get_fem_noeud(3));
2673 if (ele_inter->ele->get_nb_xfem(3)==0) decoupe_element(ele_inter->status2,ele_inter->ele,ele_inter->no2,ele_inter->ele->get_fem_noeud(0),ele_inter->ele->get_fem_noeud(1),ele_inter->ele->get_fem_noeud(2),ele_inter->ele->get_fem_noeud(3));
2674 for (int i=0;i<ele_inter->ele->get_nb_xfem(3);i++)
2675 {
2676 XFEM_ELEMENT3* xele;//=ele_inter->ele->get_xfem(i);
2677 int status=outilfem.estdansletetra(xele,ele_inter->xyz2[0],ele_inter->xyz2[1],ele_inter->xyz2[2]);
2678 if (outilfem.compare_etat(status,FEM_MAILLAGE_OUTILS::INTERIEUR)==1)
2679 {
2680 decoupe_element(ele_inter->status2,ele_inter->ele,ele_inter->no2,xele->get_fem_noeud(0),xele->get_fem_noeud(1),xele->get_fem_noeud(2),xele->get_fem_noeud(3));
2681 mai->supprimer_xfem_element3id(xele->get_id());
2682 }
2683
2684 }
2685
2686 }
2687 else
2688 {
2689 int inter;
2690 double t=0.;
2691 FEM_NOEUD* no1=ele_inter->no1;
2692 double xyz1[3]={ele_inter->xyz1[0],ele_inter->xyz1[1],ele_inter->xyz1[2]};
2693 do
2694 {
2695 inter_ele_arete xele_inter;
2696 inter=decoupe_segment_xtetra(ele_inter->ele,xseg,xyz1,ele_inter->xyz2,t,xele_inter);
2697 if (inter==1)
2698 {
2699 FEM_NOEUD* no2=new FEM_NOEUD(ele_inter->ele->get_mg_element_maillage()->get_lien_topologie(),xele_inter.xyz2[0],xele_inter.xyz2[1],xele_inter.xyz2[2]);
2700 mai->ajouter_fem_noeud(no2);
2701 FEM_NOEUD* tab[2];
2702 tab[0]=no1;
2703 tab[1]=no2;
2704 XFEM_SEGMENT2* xseg;//=new XFEM_SEGMENT2((FEM_SEGMENT2*)seg,tab);
2705 mai->ajouter_xfem_element1(xseg);
2706 xele_inter.no1=no1;
2707 xele_inter.no2=no2;
2708 //decoupe_element(xseg,&xele_inter);
2709 xyz1[0]=xele_inter.xyz2[0];
2710 xyz1[1]=xele_inter.xyz2[1];
2711 xyz1[2]=xele_inter.xyz2[2];
2712 no1=no2;
2713 mai->supprimer_xfem_element3id(xele_inter.xele->get_id());
2714 }
2715
2716 }
2717 while (inter!=0);
2718 FEM_NOEUD* tab[2];
2719 tab[0]=no1;
2720 tab[1]=ele_inter->no2;
2721 //FEM_SEGMENT2* seg=new FEM_SEGMENT2(are,tab);
2722 //mai->ajouter_fem_element1(seg);
2723 //mai->supprimer_xfem_element3id(xele->get_id());
2724 }*/
2725 }
2726 void TOIBREP::decoupe_xtri(FEM_ELEMENT3 *tet,int nb_xtri)
2727 {
2728 if (tet->get_id()==433021)
2729 std::cout <<"ttoot";
2730 if (nb_xtri!=2) return;
2731 int nbseg=5;
2732 int nbno=4;
2733 FEM_NOEUD** tabnoeud=new FEM_NOEUD*[nbno];
2734 FEM_NOEUD* tab1[3];
2735 FEM_NOEUD* tab2[3];
2736 XFEM_ELEMENT2* xtri1=(XFEM_ELEMENT2*)tet->get_xfem(2,tet->get_nb_xfem(2)-1);
2737 tab1[0]=xtri1->get_fem_noeud(0);
2738 tab1[1]=xtri1->get_fem_noeud(1);
2739 tab1[2]=xtri1->get_fem_noeud(2);
2740 XFEM_ELEMENT2* xtri2=(XFEM_ELEMENT2*)tet->get_xfem(2,tet->get_nb_xfem(2)-2);
2741 tab2[0]=xtri2->get_fem_noeud(0);
2742 tab2[1]=xtri2->get_fem_noeud(1);
2743 tab2[2]=xtri2->get_fem_noeud(2);
2744 if (tab1[0]!=tab2[0])
2745 if (tab1[0]!=tab2[1])
2746 if (tab1[0]!=tab2[2])
2747 {
2748 tabnoeud[0]=tab1[0];
2749 tabnoeud[1]=tab1[1];
2750 tabnoeud[2]=tab1[2];
2751 }
2752 if (tab1[1]!=tab2[0])
2753 if (tab1[1]!=tab2[1])
2754 if (tab1[1]!=tab2[2])
2755 {
2756 tabnoeud[0]=tab1[1];
2757 tabnoeud[1]=tab1[2];
2758 tabnoeud[2]=tab1[0];
2759 }
2760 if (tab1[2]!=tab2[0])
2761 if (tab1[2]!=tab2[1])
2762 if (tab1[2]!=tab2[2])
2763 {
2764 tabnoeud[0]=tab1[2];
2765 tabnoeud[1]=tab1[0];
2766 tabnoeud[2]=tab1[1];
2767 }
2768 if (tab2[2]!=tab1[0])
2769 if (tab2[2]!=tab1[1])
2770 if (tab2[2]!=tab1[2])
2771 tabnoeud[3]=tab2[2];
2772 if (tab2[1]!=tab1[0])
2773 if (tab2[1]!=tab1[1])
2774 if (tab2[1]!=tab1[2])
2775 tabnoeud[3]=tab2[1];
2776 if (tab2[0]!=tab1[0])
2777 if (tab2[0]!=tab1[1])
2778 if (tab2[0]!=tab1[2])
2779 tabnoeud[3]=tab2[0];
2780 TPL_LISTE_ENTITE<XFEM_ELEMENT1*> listeasupprimer;
2781 int nbxfem1=tet->get_nb_xfem(1);
2782 for (int i=0;i<nbxfem1;i++)
2783 {
2784 XFEM_ELEMENT1* xfem1=(XFEM_ELEMENT1*)tet->get_xfem(1,i);
2785 FEM_NOEUD* no1=xfem1->get_fem_noeud(0);
2786 FEM_NOEUD* no2=xfem1->get_fem_noeud(1);
2787 if ((no1->get_id()==598025) && (no2->get_id()==598034))
2788 std::cout <<"ttoot";
2789 if ((no2->get_id()==598025) && (no1->get_id()==598034))
2790 std::cout <<"ttoot";
2791 double xyz[3];
2792 int inter=inter_segment_segment_plan(xtri1,tabnoeud[1],tabnoeud[2],no1,no2,xyz);
2793 if (xtri1->get_lien_topologie()->get_id()==789)
2794 if (tet->get_nb_xfem(1)==1)
2795 //if (tet->get_nb_xfem(2)==2)
2796 if (inter==0)
2797 std::cout << tet->get_id();
2798 if (inter==1)
2799 {
2800 FEM_NOEUD* no=inserer_noeud(xfem1->get_lien_topologie(),xyz[0],xyz[1],xyz[2]);
2801 no->change_etat(0,INCONNU);
2802 FEM_NOEUD* tab[2];
2803 tab[0]=no1;
2804 tab[1]=no;
2805 XFEM_SEGMENT2* sxseg1=new XFEM_SEGMENT2(tet,xfem1->get_lien_topologie(),tab);
2806 mai->ajouter_xfem_element1(sxseg1);
2807 sxseg1->change_etat(XFRONTIERE);
2808 tab[0]=no;
2809 tab[1]=no2;
2810 XFEM_SEGMENT2* sxseg2=new XFEM_SEGMENT2(tet,xfem1->get_lien_topologie(),tab);
2811 mai->ajouter_xfem_element1(sxseg2);
2812 sxseg2->change_etat(XFRONTIERE);
2813 listeasupprimer.ajouter(xfem1);
2814 }
2815 }
2816 for (int i=0;i<listeasupprimer.get_nb();i++)
2817 mai->supprimer_xfem_element1id(listeasupprimer.get(i)->get_id());
2818 delete [] tabnoeud;
2819 }
2820
2821 void TOIBREP::recherche_interieur_face(FEM_ELEMENT3* tet,MG_FACE* face,TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*> *lstentitetopo)
2822 {
2823 int nb=tet->get_nb_xfem(1);
2824 int traite=0;
2825 for (int i=0;i<nb;i++)
2826 {
2827 XFEM_ELEMENT1* xfem=(XFEM_ELEMENT1*)tet->get_xfem(1,i);
2828 if (lstentitetopo->existe(xfem->get_lien_topologie())==1)
2829 {
2830 traite=1;
2831 MG_ARETE* are=(MG_ARETE*)xfem->get_lien_topologie();
2832 MG_COARETE* coare;
2833 int icor=0;
2834 do
2835 {
2836 coare=are->get_mg_coarete(icor);
2837 icor++;
2838 }
2839 while (coare->get_boucle()->get_mg_face()!=face);
2840 double ori=coare->get_orientation();
2841 double *xyz1=xfem->get_fem_noeud(0)->get_coord();
2842 double *xyz2=xfem->get_fem_noeud(1)->get_coord();
2843 double t;
2844 are->inverser(t,xyz1);
2845 double dxyz[3];
2846 are->deriver(t,dxyz);
2847 OT_VECTEUR_3D dir(dxyz);
2848 dir=ori*dir;
2849 dir.norme();
2850 OT_VECTEUR_3D dircor(xyz1,xyz2);
2851 dircor.norme();
2852 if (dir*dircor<0) dircor=(-1.)*dircor;
2853 double uv[2];
2854 face->inverser(uv,xyz1);
2855 double vecnormal[3];
2856 face->calcul_normale_unitaire(uv,vecnormal);
2857 OT_VECTEUR_3D nor(vecnormal);
2858 nor=face->get_mg_coface(0)->get_orientation()*nor;
2859 OT_VECTEUR_3D vecext=nor&dircor;
2860 int nbxtri=tet->get_nb_xfem(2);
2861 for (int j=0;j<nbxtri;j++)
2862 {
2863 XFEM_ELEMENT2* xfem2=(XFEM_ELEMENT2*)tet->get_xfem(2,j);
2864 if (xfem2->get_lien_topologie()==face)
2865 if ((xfem->get_fem_noeud(0)==xfem2->get_fem_noeud(0)) || (xfem->get_fem_noeud(0)==xfem2->get_fem_noeud(1)) || (xfem->get_fem_noeud(0)==xfem2->get_fem_noeud(2)) )
2866 if ((xfem->get_fem_noeud(1)==xfem2->get_fem_noeud(0)) || (xfem->get_fem_noeud(1)==xfem2->get_fem_noeud(1)) || (xfem->get_fem_noeud(1)==xfem2->get_fem_noeud(2)) )
2867 {
2868 double x=xfem2->get_fem_noeud(0)->get_x()+xfem2->get_fem_noeud(1)->get_x()+xfem2->get_fem_noeud(2)->get_x();
2869 double y=xfem2->get_fem_noeud(0)->get_y()+xfem2->get_fem_noeud(1)->get_y()+xfem2->get_fem_noeud(2)->get_y();
2870 double z=xfem2->get_fem_noeud(0)->get_z()+xfem2->get_fem_noeud(1)->get_z()+xfem2->get_fem_noeud(2)->get_z();
2871 OT_VECTEUR_3D dirxtri(x/3.-xyz1[0],y/3.-xyz1[1],z/3.-xyz1[2]);
2872 dirxtri.norme();
2873 if (dirxtri*vecext>0.)
2874 {
2875 xfem2->change_etat(XINTERIEUR);
2876 if (xfem2->get_fem_noeud(0)->get_etat(0)==INCONNU) xfem2->get_fem_noeud(0)->change_etat(0,FRONTIERE);
2877 if (xfem2->get_fem_noeud(1)->get_etat(0)==INCONNU) xfem2->get_fem_noeud(1)->change_etat(0,FRONTIERE);
2878 if (xfem2->get_fem_noeud(2)->get_etat(0)==INCONNU) xfem2->get_fem_noeud(2)->change_etat(0,FRONTIERE);
2879 }
2880 else
2881 {
2882 xfem2->change_etat(XEXTERIEUR);
2883 if (xfem2->get_fem_noeud(0)->get_etat(0)==INCONNU) xfem2->get_fem_noeud(0)->change_etat(0,EXTERIEUR);
2884 if (xfem2->get_fem_noeud(1)->get_etat(0)==INCONNU) xfem2->get_fem_noeud(1)->change_etat(0,EXTERIEUR);
2885 if (xfem2->get_fem_noeud(2)->get_etat(0)==INCONNU) xfem2->get_fem_noeud(2)->change_etat(0,EXTERIEUR);
2886 }
2887 }
2888 }
2889
2890 }
2891 }/*
2892 if (traite>0)
2893 {
2894 int changement=0;
2895 do
2896 {
2897 int nb2=tet->get_nb_xfem(2);
2898 changement=0;
2899 int casatraiter=0;
2900 for (int i=0;i<nb2;i++)
2901 {
2902 XFEM_ELEMENT2* xfem=(XFEM_ELEMENT2*)tet->get_xfem(2,i);
2903 if (xfem->get_lien_topologie()==face)
2904 if (xfem->get_etat()==XINCONNU)
2905 {
2906 casatraiter=1;
2907 if ((xfem->get_fem_noeud(0)->get_etat(0)==EXTERIEUR) || (xfem->get_fem_noeud(1)->get_etat(0)==EXTERIEUR) || (xfem->get_fem_noeud(2)->get_etat(0)==EXTERIEUR))
2908 {
2909 xfem->change_etat(XEXTERIEUR);
2910 if (xfem->get_fem_noeud(0)->get_etat(0)==INCONNU) xfem->get_fem_noeud(0)->change_etat(0,EXTERIEUR);
2911 if (xfem->get_fem_noeud(1)->get_etat(0)==INCONNU) xfem->get_fem_noeud(1)->change_etat(0,EXTERIEUR);
2912 if (xfem->get_fem_noeud(2)->get_etat(0)==INCONNU) xfem->get_fem_noeud(2)->change_etat(0,EXTERIEUR);
2913 changement=1;
2914 }
2915 else
2916 if (((xfem->get_fem_noeud(0)->get_etat(0)==FRONTIERE) && (xfem->get_fem_noeud(0)->get_lien_topologie()->get_dimension()==2)) || ((xfem->get_fem_noeud(1)->get_etat(0)==FRONTIERE) && (xfem->get_fem_noeud(1)->get_lien_topologie()->get_dimension()==2)) || ((xfem->get_fem_noeud(2)->get_etat(0)==FRONTIERE) && (xfem->get_fem_noeud(2)->get_lien_topologie()->get_dimension()==2)))
2917 {
2918 xfem->change_etat(XINTERIEUR);
2919 if (xfem->get_fem_noeud(0)->get_etat(0)==INCONNU) xfem->get_fem_noeud(0)->change_etat(0,FRONTIERE);
2920 if (xfem->get_fem_noeud(1)->get_etat(0)==INCONNU) xfem->get_fem_noeud(1)->change_etat(0,FRONTIERE);
2921 if (xfem->get_fem_noeud(2)->get_etat(0)==INCONNU) xfem->get_fem_noeud(2)->change_etat(0,FRONTIERE);
2922 changement=1;
2923 }
2924 }
2925 }
2926 if (casatraiter==0) changement=1;
2927 }
2928 while (changement==0);
2929 }*/
2930 }
2931 XFEM_TRIANGLE3* TOIBREP::inserer_xtriangle(FEM_ELEMENT_MAILLAGE* tet,MG_FACE* face,FEM_NOEUD** tabnoeud)
2932 {
2933 OT_VECTEUR_3D vec1(tabnoeud[0]->get_coord(),tabnoeud[1]->get_coord());
2934 OT_VECTEUR_3D vec2(tabnoeud[0]->get_coord(),tabnoeud[2]->get_coord());
2935 OT_VECTEUR_3D vec3=vec1&vec2;
2936 double eps=0.0000000001*longueur_caracteristique*longueur_caracteristique;
2937 double aire=vec3.get_longueur()*0.5;
2938 if (aire<eps)
2939 return NULL;
2940 XFEM_TRIANGLE3* xtri=new XFEM_TRIANGLE3(tet,face,tabnoeud);
2941 oriente_tri(xtri,face);
2942 mai->ajouter_xfem_element2(xtri);
2943 if (xtri->get_id()==616861)
2944 std::cout<<""<<std::endl;
2945 if (xtri->get_id()==616862)
2946 std::cout<<""<<std::endl;
2947 if (xtri->get_id()==616855)
2948 std::cout<<""<<std::endl;
2949 return xtri;
2950 }
2951
2952
2953
2954
2955
2956 FEM_NOEUD* TOIBREP::inserer_noeud(MG_ELEMENT_TOPOLOGIQUE* topo,double x,double y, double z)
2957 {
2958 TPL_MAP_ENTITE<FEM_NOEUD*> lstnoeud;
2959 octree_noeud.rechercher(x,y,z,0.000000001,lstnoeud);
2960 TPL_MAP_ENTITE<FEM_NOEUD*>::ITERATEUR it;
2961 for (FEM_NOEUD* no=lstnoeud.get_premier(it);no!=NULL;no=lstnoeud.get_suivant(it))
2962 {
2963 double *xyz=no->get_coord();
2964 OT_VECTEUR_3D vec(xyz[0]-x,xyz[1]-y,xyz[2]-z);
2965 if (vec.get_longueur()<0.000000001*longueur_caracteristique)
2966 {
2967 if (no->get_lien_topologie()==NULL)
2968 no->change_topologie_null(topo);
2969 return no;
2970 }
2971 }
2972 FEM_NOEUD* no=new FEM_NOEUD(topo,x,y,z);
2973 mai->ajouter_fem_noeud(no);
2974 octree_noeud.inserer(no);
2975 return no;
2976 }
2977
2978
2979
2980 void TOIBREP::importer_et_decouper(MG_GROUPE_TOPOLOGIQUE* mggt)
2981 {
2982 double xmin=1e300,ymin=1e300,zmin=1e308;
2983 double xmax=-1e300,ymax=-1e300,zmax=-1e308;
2984 TPL_MAP_ENTITE<FEM_NOEUD*> lst_noeud;
2985 LISTE_FEM_NOEUD::iterator it2;
2986 for (FEM_NOEUD* noeud=mai->get_premier_noeud(it2);noeud!=NULL;noeud=mai->get_suivant_noeud(it2))
2987 {
2988 double* xyz=noeud->get_coord();
2989 if (xyz[0]<xmin) xmin=xyz[0];
2990 if (xyz[1]<ymin) ymin=xyz[1];
2991 if (xyz[2]<zmin) zmin=xyz[2];
2992 if (xyz[0]>xmax) xmax=xyz[0];
2993 if (xyz[1]>ymax) ymax=xyz[1];
2994 if (xyz[2]>zmax) zmax=xyz[2];
2995 lst_noeud.ajouter(noeud);
2996 }
2997 BOITE_3D boite(xmin,ymin,zmin,xmax,ymax,zmax);
2998 boite.change_grosseur(1.1);
2999 //if (compteur!=NULL) compteur->ajouter_etape("Traitement de base recherche boite");
3000 longueur_caracteristique=boite.get_rayon()*2.;
3001 octree_tetra.initialiser(&lst_noeud,1,boite.get_xmin(),boite.get_ymin(),boite.get_zmin(),boite.get_xmax(),boite.get_ymax(),boite.get_zmax());
3002 octree_noeud.initialiser(&octree_tetra);
3003 //if (compteur!=NULL) compteur->ajouter_etape("Traitement de base ini octree");
3004 LISTE_FEM_ELEMENT3::iterator it3;
3005 for (FEM_ELEMENT3* tet=mai->get_premier_element3(it3);tet!=NULL;tet=mai->get_suivant_element3(it3))
3006 {
3007 octree_tetra.inserer(tet);
3008 tet->change_etat(0,INCONNU);
3009 }
3010 for (FEM_NOEUD* noeud=mai->get_premier_noeud(it2);noeud!=NULL;noeud=mai->get_suivant_noeud(it2))
3011 octree_noeud.inserer(noeud);
3012 TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*> lst;
3013 if (mggt!=NULL)
3014 {
3015 int nb=mggt->get_nb();
3016 for (int i=0;i<nb;i++)
3017 {
3018 lst.ajouter(mggt->get(i));
3019 mggt->get(i)->get_topologie_sousjacente(&lst);
3020 }
3021 }
3022 else
3023 {
3024 int nbvol=geo->get_nb_mg_volume();
3025 for (int i=0;i<nbvol;i++)
3026 {
3027 lst.ajouter(geo->get_mg_volume(i));
3028 geo->get_mg_volume(i)->get_topologie_sousjacente(&lst);
3029 }
3030 }
3031
3032 TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*>::ITERATEUR it;
3033 if (affichageactif)
3034 {
3035 char mess[300];
3036 sprintf(mess," Predecoupage sommets");
3037 affiche(mess);
3038 }
3039 for (MG_ELEMENT_TOPOLOGIQUE* eletopo=lst.get_premier(it);eletopo!=NULL;eletopo=lst.get_suivant(it))
3040 if (eletopo->get_dimension()==0)
3041 {
3042 MG_SOMMET* som=(MG_SOMMET*)eletopo;
3043 double xyz[3];
3044 som->get_point()->evaluer(xyz);
3045 TPL_MAP_ENTITE<FEM_ELEMENT3*> liste;
3046 octree_tetra.rechercher(xyz[0],xyz[1],xyz[2],1e-1,liste);
3047 TPL_MAP_ENTITE<FEM_ELEMENT3*>::ITERATEUR itl;
3048 for (FEM_ELEMENT3* ele=liste.get_premier(itl);ele!=NULL;ele=liste.get_suivant(itl))
3049 {
3050 int status=outilfem.estdansletetra(ele,xyz[0],xyz[1],xyz[2]);
3051 if (outilfem.compare_etat_tetra(status,FEM_MAILLAGE_OUTILS::INTERIEUR)==1)
3052 {
3053 FEM_NOEUD* no;
3054 if (som->get_lien_fem_maillage()->get_nb()!=0) no=(FEM_NOEUD*)som->get_lien_fem_maillage()->get(0);
3055 else
3056 {
3057 no=inserer_noeud(eletopo,xyz[0],xyz[1],xyz[2]);
3058 no->change_etat(0,FRONTIERE);
3059 }
3060 XFEM_ELEMENT0 *xele0=new XFEM_ELEMENT0(ele,eletopo,&no);
3061 mai->ajouter_xfem_element0(xele0);
3062 xele0->change_etat(XFRONTIERE);
3063 decoupe_element(status,no,ele);
3064 }
3065
3066
3067 }
3068
3069 }
3070 if (compteur!=NULL)
3071 {
3072 double tps=compteur->ajouter_etape("Predecoupage sommets");
3073 if (affichageactif)
3074 {
3075 char mess[300];
3076 sprintf(mess," ---> CPU : %lf",tps);
3077 affiche(mess);
3078 }
3079 }
3080 testtopo();
3081 if (affichageactif)
3082 {
3083 char mess[300];
3084 sprintf(mess," Predecoupage aretes");
3085 affiche(mess);
3086 }
3087 for (MG_ELEMENT_TOPOLOGIQUE* eletopo=lst.get_premier(it);eletopo!=NULL;eletopo=lst.get_suivant(it))
3088 if (eletopo->get_dimension()==1)
3089 {
3090 MG_ARETE* are=(MG_ARETE*)eletopo;
3091 MG_SOMMET* som1=are->get_cosommet1()->get_sommet();
3092 MG_SOMMET* som2=are->get_cosommet2()->get_sommet();
3093 double xyz1[3],xyzcible[3];
3094 inter_ele_arete ele_inter;
3095 ele_inter.are=are;
3096 som1->get_point()->evaluer(xyz1);
3097 som2->get_point()->evaluer(xyzcible);
3098 double t=are->get_tmin();
3099 FEM_NOEUD* no1=(FEM_NOEUD*)som1->get_lien_fem_maillage()->get(0);
3100 FEM_NOEUD* nofin=(FEM_NOEUD*)som2->get_lien_fem_maillage()->get(0);
3101 int inter;
3102 do
3103 {
3104 inter=decoupe_arete_tetra(are,xyz1,xyzcible,t,ele_inter);
3105 if (inter==1)
3106 {
3107 FEM_NOEUD* no2=inserer_noeud(are,ele_inter.xyz2[0],ele_inter.xyz2[1],ele_inter.xyz2[2]);
3108 no2->change_etat(0,FRONTIERE);
3109 FEM_NOEUD* tab[2];
3110 tab[0]=no1;
3111 tab[1]=no2;
3112 XFEM_SEGMENT2* xseg=new XFEM_SEGMENT2(ele_inter.ele,are,tab);
3113 mai->ajouter_xfem_element1(xseg);
3114 xseg->change_etat(XFRONTIERE);
3115 decoupe_element(ele_inter.status1,no1,ele_inter.ele);
3116 decoupe_element(ele_inter.status2,no2,ele_inter.ele);
3117 ele_inter.no1=no1;
3118 ele_inter.no2=no2;
3119 decoupe_element(xseg,&ele_inter);
3120 xyz1[0]=ele_inter.xyz2[0];
3121 xyz1[1]=ele_inter.xyz2[1];
3122 xyz1[2]=ele_inter.xyz2[2];
3123 no1=no2;
3124 }
3125
3126 }
3127 while (inter!=0);
3128 FEM_NOEUD* tab[2];
3129 tab[0]=no1;
3130 tab[1]=nofin;
3131 XFEM_SEGMENT2* xseg=new XFEM_SEGMENT2(ele_inter.ele,are,tab);
3132 xseg->change_etat(XFRONTIERE);
3133 mai->ajouter_xfem_element1(xseg);
3134 ele_inter.no1=no1;
3135 ele_inter.no2=nofin;
3136 decoupe_element(-1,no1,ele_inter.ele);
3137 decoupe_element(-1,nofin,ele_inter.ele);
3138 decoupe_element(xseg,&ele_inter);
3139
3140 }
3141 if (compteur!=NULL)
3142 {
3143 double tps=compteur->ajouter_etape("Predecoupage aretes");
3144 if (affichageactif)
3145 {
3146 char mess[300];
3147 sprintf(mess," ---> CPU : %lf",tps);
3148 affiche(mess);
3149 }
3150 }
3151 testtopo();
3152 if (affichageactif)
3153 {
3154 char mess[300];
3155 sprintf(mess," Decoupage XFEM");
3156 affiche(mess);
3157 }
3158 int numdebuttps;
3159 if (compteur!=NULL)
3160 {
3161 std::string nom;
3162 numdebuttps=compteur->get_nb_etape()-1;
3163 }
3164 int compteur_dim2=0;
3165 for (MG_ELEMENT_TOPOLOGIQUE* eletopo=lst.get_premier(it);eletopo!=NULL;eletopo=lst.get_suivant(it))
3166 if ((eletopo->get_dimension()==2) && (compteur_dim2++==2))
3167 {
3168 for (FEM_NOEUD* noeud=mai->get_premier_noeud(it2);noeud!=NULL;noeud=mai->get_suivant_noeud(it2))
3169 noeud->change_solution(1e300);
3170 for (FEM_ELEMENT3* tet=mai->get_premier_element3(it3);tet!=NULL;tet=mai->get_suivant_element3(it3))
3171 tet->change_solution(0.);
3172 MG_FACE* face=(MG_FACE*)eletopo;
3173 if (affichageactif)
3174 {
3175 char mess[300];
3176 sprintf(mess," Face id %lu",face->get_id());
3177 affiche(mess);
3178 }
3179 //if (!lst.existe(face)) continue;
3180 TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*> lstentitetopo;
3181 face->get_topologie_sousjacente(&lstentitetopo);
3182 levelsetn(&lst,face,&lstentitetopo);
3183 for (FEM_ELEMENT3* tet=mai->get_premier_element3(it3);tet!=NULL;tet=mai->get_suivant_element3(it3))
3184 if (tet->get_etat(1)==1)
3185 {
3186 int nb_xtri=decoupe_tetra(tet,face);
3187 decoupe_xtri(tet,nb_xtri);
3188 decoupe_element2_par_element1et0(tet,&lstentitetopo);
3189 //recherche_interieur_face(tet,face,&lstentitetopo);
3190 }
3191 else
3192 {
3193 for (int num=0;num<2;num++)
3194 for (int i=0;i<tet->get_nb_xfem(num);i++)
3195 {
3196 MG_ELEMENT_TOPOLOGIQUE* mgt=tet->get_xfem(num,i)->get_lien_topologie();
3197 if (lstentitetopo.existe(mgt)==1)
3198 std::cout << "probleme tetra "<< num << ":" << tet->get_id() << " " << tet->get_etat(1) <<" = " << tet->get_fem_noeud(0)->get_etat(1)<< "-"<< tet->get_fem_noeud(1)->get_etat(1)<< "-"<< tet->get_fem_noeud(2)->get_etat(1)<< "-"<< tet->get_fem_noeud(3)->get_etat(1) << std::endl;
3199
3200 }
3201 }
3202
3203 }
3204
3205 if (compteur!=NULL)
3206 {
3207 std::string nom;
3208 double tps;
3209 compteur->get_etape(numdebuttps,compteur->get_nb_etape()-1,nom,tps);
3210 if (affichageactif)
3211 {
3212 char mess[300];
3213 sprintf(mess," ---> CPU : %lf",tps);
3214 affiche(mess);
3215 }
3216
3217 }
3218
3219
3220 for (FEM_ELEMENT3* tet=mai->get_premier_element3(it3);tet!=NULL;tet=mai->get_suivant_element3(it3))
3221 {
3222 double vol;
3223 int res=tet->verifie_validite_decoupage_xfem(&vol);
3224 int valide=res&1;
3225 int volnul=(res<<1)&1;
3226 if (valide==0)
3227 {
3228 std::cout << "Erreur decoupage tetra de id " << tet->get_id() << " volume residuel " << vol << std::endl;
3229 }
3230 if (volnul==1)
3231 {
3232 std::cout << "Erreur decoupage tetra de id " << tet->get_id() << " volume nul d'un xfem" << std::endl;
3233 }
3234 int nb1=tet->get_nb_xfem(1);
3235 for (int i=0;i<nb1;i++)
3236 {
3237 XFEM_ELEMENT1* xseg=(XFEM_ELEMENT1*)tet->get_xfem(1,i);
3238 FEM_NOEUD* no1=xseg->get_fem_noeud(0);
3239 FEM_NOEUD* no2=xseg->get_fem_noeud(1);
3240 int nb3=tet->get_nb_xfem(3);
3241 int trouve=0;
3242 for (int j=0;j<nb3;j++)
3243 {
3244 XFEM_ELEMENT3* xtettmp=(XFEM_ELEMENT3*)tet->get_xfem(3,j);
3245 FEM_NOEUD* not1=xtettmp->get_fem_noeud(0);
3246 FEM_NOEUD* not2=xtettmp->get_fem_noeud(1);
3247 FEM_NOEUD* not3=xtettmp->get_fem_noeud(2);
3248 FEM_NOEUD* not4=xtettmp->get_fem_noeud(3);
3249 if ((no1==not1) || (no1==not2) || (no1==not3) || (no1==not4))
3250 if ((no2==not1) || (no2==not2) || (no2==not3) || (no2==not4))
3251 trouve=1;
3252
3253 }
3254 if (trouve==0)
3255 std::cout << "Erreur decoupage tetra de id " << tet->get_id() << " xfem1 pas coherent " << std::endl;
3256 }
3257 if (tet->get_id()==-407234)
3258 {
3259 MG_MAILLAGE* mgmai=mai->get_mg_maillage();
3260 FEM_MAILLAGE *femtmp=new FEM_MAILLAGE(mgmai->get_mg_geometrie(),mgmai,1);
3261 mgmai->get_gestionnaire()->ajouter_fem_maillage(femtmp);
3262 FEM_NOEUD* no1=tet->get_fem_noeud(0);
3263 FEM_NOEUD* no2=tet->get_fem_noeud(1);
3264 FEM_NOEUD* no3=tet->get_fem_noeud(2);
3265 FEM_NOEUD* no4=tet->get_fem_noeud(3);
3266 FEM_NOEUD* notmp1=new FEM_NOEUD(no1->get_lien_topologie(),no1->get_x(),no1->get_y(),no1->get_z());
3267 FEM_NOEUD* notmp2=new FEM_NOEUD(no2->get_lien_topologie(),no2->get_x(),no2->get_y(),no2->get_z());
3268 FEM_NOEUD* notmp3=new FEM_NOEUD(no3->get_lien_topologie(),no3->get_x(),no3->get_y(),no3->get_z());
3269 FEM_NOEUD* notmp4=new FEM_NOEUD(no4->get_lien_topologie(),no4->get_x(),no4->get_y(),no4->get_z());
3270 femtmp->ajouter_fem_noeud(notmp1);
3271 femtmp->ajouter_fem_noeud(notmp2);
3272 femtmp->ajouter_fem_noeud(notmp3);
3273 femtmp->ajouter_fem_noeud(notmp4);
3274 FEM_NOEUD* tab[4];
3275 tab[0]=notmp1;
3276 tab[1]=notmp2;
3277 tab[2]=notmp3;
3278 tab[3]=notmp4;
3279 FEM_TETRA4* tettmp=new FEM_TETRA4(tet->get_lien_topologie(),tet->get_mg_element_maillage(),tab);
3280 femtmp->ajouter_fem_element3(tettmp);
3281 int nb1=tet->get_nb_xfem(1);
3282 for (int j=0;j<nb1;j++)
3283 {
3284 XFEM_ELEMENT1* xtettmp=(XFEM_ELEMENT1*)tet->get_xfem(1,j);
3285 FEM_NOEUD* not1=xtettmp->get_fem_noeud(0);
3286 FEM_NOEUD* not2=xtettmp->get_fem_noeud(1);
3287 FEM_NOEUD* notmp1=new FEM_NOEUD(not1->get_lien_topologie(),not1->get_x(),not1->get_y(),not1->get_z());
3288 FEM_NOEUD* notmp2=new FEM_NOEUD(not2->get_lien_topologie(),not2->get_x(),not2->get_y(),not2->get_z());
3289 femtmp->ajouter_fem_noeud(notmp1);
3290 femtmp->ajouter_fem_noeud(notmp2);
3291 FEM_NOEUD* tab[4];
3292 tab[0]=notmp1;
3293 tab[1]=notmp2;
3294 XFEM_SEGMENT2* xtet2=new XFEM_SEGMENT2(tettmp,tet->get_lien_topologie(),tab);
3295 femtmp->ajouter_xfem_element1(xtet2);
3296 OT_VECTEUR_3D vec(notmp1->get_coord(),notmp2->get_coord());
3297 std::cout << vec.get_longueur() << std::endl;
3298 }
3299 int nb3=tet->get_nb_xfem(3);
3300 for (int j=0;j<nb3;j++)
3301 {
3302 XFEM_ELEMENT3* xtettmp=(XFEM_ELEMENT3*)tet->get_xfem(3,j);
3303 FEM_NOEUD* not1=xtettmp->get_fem_noeud(0);
3304 FEM_NOEUD* not2=xtettmp->get_fem_noeud(1);
3305 FEM_NOEUD* not3=xtettmp->get_fem_noeud(2);
3306 FEM_NOEUD* not4=xtettmp->get_fem_noeud(3);
3307 FEM_NOEUD* notmp1=new FEM_NOEUD(not1->get_lien_topologie(),not1->get_x(),not1->get_y(),not1->get_z());
3308 FEM_NOEUD* notmp2=new FEM_NOEUD(not2->get_lien_topologie(),not2->get_x(),not2->get_y(),not2->get_z());
3309 FEM_NOEUD* notmp3=new FEM_NOEUD(not3->get_lien_topologie(),not3->get_x(),not3->get_y(),not3->get_z());
3310 FEM_NOEUD* notmp4=new FEM_NOEUD(not4->get_lien_topologie(),not4->get_x(),not4->get_y(),not4->get_z());
3311 femtmp->ajouter_fem_noeud(notmp1);
3312 femtmp->ajouter_fem_noeud(notmp2);
3313 femtmp->ajouter_fem_noeud(notmp3);
3314 femtmp->ajouter_fem_noeud(notmp4);
3315 FEM_NOEUD* tab[4];
3316 tab[0]=notmp1;
3317 tab[1]=notmp2;
3318 tab[2]=notmp3;
3319 tab[3]=notmp4;
3320 XFEM_TETRA4* xtet2=new XFEM_TETRA4(tettmp,tet->get_lien_topologie(),tab);
3321 femtmp->ajouter_xfem_element3(xtet2);
3322 }
3323
3324
3325 }
3326
3327 }
3328
3329
3330
3331 }
3332
3333
3334 int TOIBREP::decoupe_segment_xtetra(FEM_ELEMENT3* ele,XFEM_ELEMENT1* seg,double *xyz,double *xyzcible,double &t,inter_ele_arete& xele_inter)
3335 {
3336 int code_retour=0;
3337 int nb=ele->get_nb_xfem(3);
3338 for (int i=0;i<nb;i++)
3339 {
3340 XFEM_ELEMENT3* xele=(XFEM_ELEMENT3*)ele->get_xfem(3,i);
3341 int status=outilfem.estdansletetra(xele,xyz[0],xyz[1],xyz[2]);
3342 if (outilfem.compare_etat_tetra(status,FEM_MAILLAGE_OUTILS::INTERIEUR)==1)
3343 {
3344 int status2=outilfem.estdansletetra(xele,xyzcible[0],xyzcible[1],xyzcible[2]);
3345 if (outilfem.compare_etat_tetra(status2,FEM_MAILLAGE_OUTILS::INTERIEUR)==1) return 0;
3346 double xyz1[3],uv1[3],xyz4[3],uv4[3],xyz2[3],uv2[3],xyz3[3],uv3[3];
3347 uv1[2]=t;
3348 uv2[2]=t;
3349 uv3[2]=t;
3350 uv4[2]=t;
3351 int inter_face1=intersection_segment_triangle(seg->get_fem_noeud(0),seg->get_fem_noeud(1),xele->get_fem_noeud(0),xele->get_fem_noeud(1),xele->get_fem_noeud(2),xyz1,uv1);
3352 int inter_face2=intersection_segment_triangle(seg->get_fem_noeud(0),seg->get_fem_noeud(1),xele->get_fem_noeud(0),xele->get_fem_noeud(1),xele->get_fem_noeud(3),xyz2,uv2);
3353 int inter_face3=intersection_segment_triangle(seg->get_fem_noeud(0),seg->get_fem_noeud(1),xele->get_fem_noeud(0),xele->get_fem_noeud(2),xele->get_fem_noeud(3),xyz3,uv3);
3354 int inter_face4=intersection_segment_triangle(seg->get_fem_noeud(0),seg->get_fem_noeud(1),xele->get_fem_noeud(1),xele->get_fem_noeud(2),xele->get_fem_noeud(3),xyz4,uv4);
3355 xele_inter.status2=1;
3356 if (inter_face1==1)
3357 {
3358 t=uv1[2];
3359 xele_inter.xele=xele;
3360 xele_inter.xyz1[0]=xyz[0];
3361 xele_inter.xyz1[1]=xyz[1];
3362 xele_inter.xyz1[2]=xyz[2];
3363 xele_inter.xyz2[0]=xyz1[0];
3364 xele_inter.xyz2[1]=xyz1[1];
3365 xele_inter.xyz2[2]=xyz1[2];
3366 xele_inter.status1=status;
3367 xele_inter.status2=xele_inter.status2+4;
3368 code_retour=1;
3369 }
3370 if (inter_face2==1)
3371 {
3372 t=uv2[1];
3373 xele_inter.xele=xele;
3374 xele_inter.xyz1[0]=xyz[0];
3375 xele_inter.xyz1[1]=xyz[1];
3376 xele_inter.xyz1[2]=xyz[2];
3377 xele_inter.xyz2[0]=xyz2[0];
3378 xele_inter.xyz2[1]=xyz2[1];
3379 xele_inter.xyz2[2]=xyz2[2];
3380 xele_inter.status1=status;
3381 xele_inter.status2=xele_inter.status2+8;
3382 code_retour=1;
3383 }
3384 if (inter_face3==1)
3385 {
3386 t=uv3[2];
3387 xele_inter.xele=xele;
3388 xele_inter.xyz1[0]=xyz[0];
3389 xele_inter.xyz1[1]=xyz[1];
3390 xele_inter.xyz1[2]=xyz[2];
3391 xele_inter.xyz2[0]=xyz3[0];
3392 xele_inter.xyz2[1]=xyz3[1];
3393 xele_inter.xyz2[2]=xyz3[2];
3394 xele_inter.status1=status;
3395 xele_inter.status2=xele_inter.status2+16;
3396 code_retour=1;
3397 }
3398 if (inter_face4==1)
3399 {
3400 t=uv4[2];
3401 xele_inter.xele=xele;
3402 xele_inter.xyz1[0]=xyz[0];
3403 xele_inter.xyz1[1]=xyz[1];
3404 xele_inter.xyz1[2]=xyz[2];
3405 xele_inter.xyz2[0]=xyz4[0];
3406 xele_inter.xyz2[1]=xyz4[1];
3407 xele_inter.xyz2[2]=xyz4[2];
3408 xele_inter.status1=status;
3409 xele_inter.status2=xele_inter.status2+32;
3410 code_retour=1;
3411 }
3412
3413 }
3414 }
3415 }
3416
3417
3418 int TOIBREP::decoupe_arete_tetra(MG_ARETE* are,double *xyz,double *xyzcible,double &t,inter_ele_arete& ele_inter)
3419 {
3420 int code_retour=0;
3421 TPL_MAP_ENTITE<FEM_ELEMENT3*> liste;
3422 octree_tetra.rechercher(xyz[0],xyz[1],xyz[2],1e-10,liste);
3423 TPL_MAP_ENTITE<FEM_ELEMENT3*>::ITERATEUR itl;
3424 for (FEM_ELEMENT3* ele=liste.get_premier(itl);ele!=NULL;ele=liste.get_suivant(itl))
3425 {
3426 int status=outilfem.estdansletetra(ele,xyz[0],xyz[1],xyz[2]);
3427 if (outilfem.compare_etat_tetra(status,FEM_MAILLAGE_OUTILS::INTERIEUR)==1)
3428 {
3429 int status2=outilfem.estdansletetra(ele,xyzcible[0],xyzcible[1],xyzcible[2]);
3430 if (outilfem.compare_etat_tetra(status2,FEM_MAILLAGE_OUTILS::INTERIEUR)==1) {ele_inter.ele=ele;return 0;}
3431 double uv1[3],xyz1[3],uv2[3],xyz2[3],uv3[3],xyz3[3],uv4[3],xyz4[3];
3432 int inter_face1,inter_face2,inter_face3,inter_face4;
3433 int boucle=0;
3434 double titer=are->get_tmax()-t;
3435 do
3436 {
3437 if (t+boucle*0.05*titer>are->get_tmax()) break;
3438 uv1[2]=t+boucle*0.05*titer;
3439 uv2[2]=t+boucle*0.05*titer;
3440 uv3[2]=t+boucle*0.05*titer;
3441 uv4[2]=t+boucle*0.05*titer;
3442 inter_face1=intersection_arete_triangle(are,ele->get_fem_noeud(0),ele->get_fem_noeud(1),ele->get_fem_noeud(2),uv1,xyz1);
3443 inter_face2=intersection_arete_triangle(are,ele->get_fem_noeud(0),ele->get_fem_noeud(1),ele->get_fem_noeud(3),uv2,xyz2);
3444 inter_face3=intersection_arete_triangle(are,ele->get_fem_noeud(0),ele->get_fem_noeud(2),ele->get_fem_noeud(3),uv3,xyz3);
3445 inter_face4=intersection_arete_triangle(are,ele->get_fem_noeud(1),ele->get_fem_noeud(2),ele->get_fem_noeud(3),uv4,xyz4);
3446 boucle++;
3447 }
3448 while (inter_face1+inter_face2+inter_face3+inter_face4==0);
3449 ele_inter.status2=1;
3450 if (inter_face1==1)
3451 {
3452 OT_VECTEUR_3D vec(xyz,xyz1);
3453 if (vec.get_longueur()<1e-10) inter_face1=0;
3454 else
3455 {
3456 t=uv1[2];
3457 ele_inter.ele=ele;
3458 ele_inter.status2=ele_inter.status2+4;
3459 ele_inter.status1=status;
3460 ele_inter.xyz1[0]=xyz[0];
3461 ele_inter.xyz1[1]=xyz[1];
3462 ele_inter.xyz1[2]=xyz[2];
3463 ele_inter.xyz2[0]=xyz1[0];
3464 ele_inter.xyz2[1]=xyz1[1];
3465 ele_inter.xyz2[2]=xyz1[2];
3466 code_retour=1;
3467
3468 }
3469 }
3470 if (inter_face2==1)
3471 {
3472 OT_VECTEUR_3D vec(xyz,xyz2);
3473 if (vec.get_longueur()<1e-10) inter_face1=0;
3474 else
3475 {
3476 t=uv2[2];
3477 ele_inter.ele=ele;
3478 ele_inter.status2=ele_inter.status2+8;
3479 ele_inter.status1=status;
3480 ele_inter.xyz1[0]=xyz[0];
3481 ele_inter.xyz1[1]=xyz[1];
3482 ele_inter.xyz1[2]=xyz[2];
3483 ele_inter.xyz2[0]=xyz2[0];
3484 ele_inter.xyz2[1]=xyz2[1];
3485 ele_inter.xyz2[2]=xyz2[2];
3486 code_retour=1;
3487 }
3488
3489 }
3490 if (inter_face3==1)
3491 {
3492 OT_VECTEUR_3D vec(xyz,xyz3);
3493 if (vec.get_longueur()<1e-10) inter_face1=0;
3494 else
3495 {
3496 t=uv3[2];
3497 ele_inter.ele=ele;
3498 ele_inter.status2=ele_inter.status2+16;
3499 ele_inter.status1=status;
3500 ele_inter.xyz1[0]=xyz[0];
3501 ele_inter.xyz1[1]=xyz[1];
3502 ele_inter.xyz1[2]=xyz[2];
3503 ele_inter.xyz2[0]=xyz3[0];
3504 ele_inter.xyz2[1]=xyz3[1];
3505 ele_inter.xyz2[2]=xyz3[2];
3506 code_retour=1;
3507 }
3508
3509 }
3510 if (inter_face4==1)
3511 {
3512 OT_VECTEUR_3D vec(xyz,xyz4);
3513 if (vec.get_longueur()<1e-10) inter_face1=0;
3514 else
3515 {
3516 t=uv4[2];
3517 ele_inter.ele=ele;
3518 ele_inter.status2=ele_inter.status2+32;
3519 ele_inter.status1=status;
3520 ele_inter.xyz1[0]=xyz[0];
3521 ele_inter.xyz1[1]=xyz[1];
3522 ele_inter.xyz1[2]=xyz[2];
3523 ele_inter.xyz2[0]=xyz4[0];
3524 ele_inter.xyz2[1]=xyz4[1];
3525 ele_inter.xyz2[2]=xyz4[2];
3526 code_retour=1;
3527
3528 }
3529
3530 }
3531 }
3532 }
3533 return code_retour;
3534 }
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552 void TOIBREP::ajouter_liste(LISTE_FM_TRI &lst,LISTE_FM_TRI_ID &lstid,FEM_ELEMENT3* tet,double val)
3553 {
3554 pair<double,FEM_ELEMENT3*> p(val,tet);
3555 LISTE_FM_TRI::iterator it=lst.insert(p);
3556 lstid[tet->get_id()]=it;
3557 }
3558
3559 void TOIBREP::supprimer_liste(LISTE_FM_TRI &lst,LISTE_FM_TRI_ID &lstid,FEM_ELEMENT3* tet)
3560 {
3561 LISTE_FM_TRI::iterator it2=lstid[tet->get_id()];
3562 LISTE_FM_TRI_ID::iterator it3=lstid.find(tet->get_id());
3563 lstid.erase(it3);
3564 lst.erase(it2);
3565 }
3566
3567 void TOIBREP::ajouter_liste(LISTE_FM& lst,FEM_ELEMENT3* tet)
3568 {
3569 lst.push_back(tet);
3570 }
3571
3572 void TOIBREP::supprimer_liste(LISTE_FM& lst,FEM_ELEMENT3* tet)
3573 {
3574 LISTE_FM::iterator it=find(lst.begin(),lst.end(),tet);
3575 if (it!=lst.end()) lst.erase(it);
3576 }
3577
3578
3579
3580 double TOIBREP::resoudgradT(FEM_ELEMENT3* tet,int *signe)
3581 {
3582 double j[9];
3583 double N[12];
3584 double jN[12]={0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.};
3585 double T[4];
3586 double uv[2]={0.25,0.25};
3587
3588
3589 tet->get_inverse_jacob(j,uv);
3590 for (int i=0;i<3;i++)
3591 for (int k=0;k<4;k++)
3592 N[i*4+k]=tet->get_fonction_derive_interpolation(k+1,i+1,uv);
3593 int premier=0;
3594 double tmin=1e300;
3595 double tmax=-1e300;
3596 for (int i=0;i<4;i++)
3597 {
3598 if (i==tet->get_numero()) continue;
3599 T[i]=tet->get_fem_noeud(i)->get_solution();
3600 if (fabs(T[i])>0.000001)
3601 {
3602 if (premier==0)
3603 if (T[i]>0) (*signe)=1; else (*signe)=-1;
3604 else if (T[i]*(*signe)<0) (*signe)=0;
3605 }
3606 T[i]=fabs(T[i]);
3607 if (tet->get_numero()!=i)
3608 {
3609 if (T[i]<tmin) tmin=T[i];
3610 if (T[i]>tmax) tmax=T[i];
3611 }
3612 premier=1;
3613 }
3614 for (int i=0;i<3;i++)
3615 for (int k=0;k<4;k++)
3616 for (int l=0;l<3;l++)
3617 jN[i*4+k]=jN[i*4+k]+j[i*3+l]*N[l*4+k];
3618 double a=0.,b=0.,c=-1.;
3619 for (int i=0;i<3;i++)
3620 {
3621 double coef=0.;
3622 double coefinc=0.;
3623 for (int l=0;l<4;l++)
3624 {
3625 if (tet->get_numero()!=l) coef=coef+jN[i*4+l]*T[l];
3626 else coefinc=coefinc+jN[i*4+l];
3627 }
3628 c=c+coef*coef;
3629 a=a+coefinc*coefinc;
3630 b=b+2*coef*coefinc;
3631 }
3632 /*if (*signe==0)
3633 cout << "attention " <<endl;*/
3634 double det=b*b-4.*a*c;
3635 if (det<0.) det=0.; else det=sqrt(det);
3636 double sol1=(-b-det)/2./a;
3637 double sol2=(-b+det)/2./a;
3638 double sol=sol1;
3639 if (sol2>sol1) sol=sol2;
3640 if (sol<tmin*0.99)
3641 sol=0.;
3642 sol=sol*(*signe);
3643 return sol;
3644 }
3645
3646
3647
3648
3649
3650
3651
3652
3653 int TOIBREP::inter_segment_segment_plan(XFEM_ELEMENT2 *xfem2,FEM_NOEUD *no1,FEM_NOEUD *no2,FEM_NOEUD *nos1,FEM_NOEUD *nos2,double *xyz)
3654 {
3655 OT_VECTEUR_3D n1n2(xfem2->get_fem_noeud(0)->get_coord(),xfem2->get_fem_noeud(1)->get_coord());
3656 OT_VECTEUR_3D n1n3(xfem2->get_fem_noeud(0)->get_coord(),xfem2->get_fem_noeud(2)->get_coord());
3657 OT_VECTEUR_3D n=n1n2&n1n3;
3658 n.norme();
3659 double d=-(n.get_x()*xfem2->get_fem_noeud(0)->get_x()+n.get_y()*xfem2->get_fem_noeud(0)->get_y()+n.get_z()*xfem2->get_fem_noeud(0)->get_z());
3660 double t1=-(n.get_x()*nos1->get_x()+n.get_y()*nos1->get_y()+n.get_z()*nos1->get_z()+d);
3661 double t2=-(n.get_x()*nos2->get_x()+n.get_y()*nos2->get_y()+n.get_z()*nos2->get_z()+d);
3662 double xyzs1p[3];
3663 xyzs1p[0]=nos1->get_x()+t2*n.get_x();
3664 xyzs1p[1]=nos1->get_y()+t2*n.get_y();
3665 xyzs1p[2]=nos1->get_z()+t2*n.get_z();
3666 double xyzs2p[3];
3667 xyzs2p[0]=nos2->get_x()+t2*n.get_x();
3668 xyzs2p[1]=nos2->get_y()+t2*n.get_y();
3669 xyzs2p[2]=nos2->get_z()+t2*n.get_z();
3670 double *xyz1=no1->get_coord();
3671 double *xyz2=no2->get_coord();
3672 double ab[3],cd[3],ac[3];
3673 ab[0]=xyz2[0]-xyz1[0];
3674 ab[1]=xyz2[1]-xyz1[1];
3675 ab[2]=xyz2[2]-xyz1[2];
3676 cd[0]=xyzs2p[0]-xyzs1p[0];
3677 cd[1]=xyzs2p[1]-xyzs1p[1];
3678 cd[2]=xyzs2p[2]-xyzs1p[2];
3679 ac[0]=xyzs1p[0]-xyz1[0];
3680 ac[1]=xyzs1p[1]-xyz1[1];
3681 ac[2]=xyzs1p[2]-xyz1[2];
3682 int n1,n2;
3683 double det1=-ab[0]*cd[1]+ab[1]*cd[0];
3684 double det2=-ab[0]*cd[2]+ab[2]*cd[0];
3685 double det3=-ab[1]*cd[2]+ab[2]*cd[1];
3686 double det;
3687 if ( (fabs(det1)>=fabs(det2)) && (fabs(det1)>=fabs(det3)) )
3688 {
3689 n1=0;
3690 n2=1;
3691 det=det1;
3692 }
3693 else
3694 {
3695 if ( (fabs(det2)>=fabs(det1)) && (fabs(det2)>=fabs(det3)) )
3696 {
3697 n1=0;
3698 n2=2;
3699 det=det2;
3700 }
3701 else
3702 {
3703 if ( (fabs(det3)>=fabs(det2)) && (fabs(det3)>=fabs(det1)) )
3704 {
3705 n1=1;
3706 n2=2;
3707 det=det3;
3708 }
3709 else return 0;
3710 }
3711 }
3712 double tt=ab[n1]*ac[n2]-ab[n2]*ac[n1];
3713 tt=tt/det;
3714 if (tt<0.0000000001) return 0;
3715 if (tt>1.-0.0000000001) return 0;
3716 xyz[0]=nos1->get_x()+tt*(nos2->get_x()-nos1->get_x());
3717 xyz[1]=nos1->get_y()+tt*(nos2->get_y()-nos1->get_y());
3718 xyz[2]=nos1->get_z()+tt*(nos2->get_z()-nos1->get_z());
3719 return 1;
3720 }
3721
3722
3723
3724 void TOIBREP::testtopo(void)
3725 {
3726 LISTE_XFEM_ELEMENT0::iterator it0;
3727 LISTE_XFEM_ELEMENT1::iterator it1;
3728 LISTE_XFEM_ELEMENT2::iterator it2;
3729 LISTE_XFEM_ELEMENT3::iterator it3;
3730 for (XFEM_ELEMENT0 *ele=mai->get_premier_xelement0(it0);ele!=NULL;ele=mai->get_suivant_xelement0(it0))
3731 {
3732 if (ele->get_fem_noeud(0)->get_lien_topologie()==NULL) std::cout << "Noeud de xele 0 " << ele->get_fem_noeud(0)->get_id() << " non attache à la topologie" << std::endl;
3733 }
3734 for (XFEM_ELEMENT1 *ele=mai->get_premier_xelement1(it1);ele!=NULL;ele=mai->get_suivant_xelement1(it1))
3735 {
3736 if (ele->get_lien_topologie()==NULL) std::cout << "Xele1 " << ele->get_id() << " non attache à la topologie " << std::endl;
3737 if (ele->get_fem_noeud(0)->get_lien_topologie()==NULL) std::cout << "Noeud de xele 1 " << ele->get_fem_noeud(0)->get_id() << " non attache à la topologie. " << ele->get_fem_noeud(0)->get_lien_element3()->get_nb() << " tetras lies" << std::endl;
3738 if (ele->get_fem_noeud(1)->get_lien_topologie()==NULL) std::cout << "Noeud de xele 1 " << ele->get_fem_noeud(1)->get_id() << " non attache à la topologie. " << ele->get_fem_noeud(0)->get_lien_element3()->get_nb() << " tetras lies" << std::endl;
3739 }
3740 for (XFEM_ELEMENT2 *ele=mai->get_premier_xelement2(it2);ele!=NULL;ele=mai->get_suivant_xelement2(it2))
3741 {
3742 if (ele->get_lien_topologie()==NULL) std::cout << "Xele2 " << ele->get_id() << " non attache à la topologie " << std::endl;
3743 if (ele->get_fem_noeud(0)->get_lien_topologie()==NULL) std::cout << "Noeud de xele 2 " << ele->get_fem_noeud(0)->get_id() << " non attache à la topologie" << std::endl;
3744 if (ele->get_fem_noeud(1)->get_lien_topologie()==NULL) std::cout << "Noeud de xele 2 " << ele->get_fem_noeud(1)->get_id() << " non attache à la topologie" << std::endl;
3745 }
3746 /*for (XFEM_ELEMENT3 *ele=mai->get_premier_xelement3(it3);ele!=NULL;ele=mai->get_suivant_xelement3(it3))
3747 {
3748 if (ele->get_fem_noeud(0)->get_lien_topologie()==NULL) std::cout << "Noeud de xele 3" << ele->get_fem_noeud(0)->get_id() << " non attache à la topologie" << std::endl;
3749 if (ele->get_fem_noeud(1)->get_lien_topologie()==NULL) std::cout << "Noeud de xele 3" << ele->get_fem_noeud(1)->get_id() << " non attache à la topologie" << std::endl;
3750 if (ele->get_fem_noeud(2)->get_lien_topologie()==NULL) std::cout << "Noeud de xele 3" << ele->get_fem_noeud(2)->get_id() << " non attache à la topologie" << std::endl;
3751 }*/
3752
3753
3754 }
3755