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

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