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