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

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