MAGiC  V5.0
Mailleurs Automatiques de Géometries intégrés à la Cao
fem_maillage_outils.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 //####// fem_maillage_outils.cpp
15 //####//
16 //####//------------------------------------------------------------
17 //####//------------------------------------------------------------
18 //####// COPYRIGHT 2000-2024
19 //####// jeu 13 jun 2024 11:58:55 EDT
20 //####//------------------------------------------------------------
21 //####//------------------------------------------------------------
22 #include "gestionversion.h"
23 #include "fem_maillage_outils.h"
24 #include "mg_element_maillage.h"
25 #include "fem_tetra4.h"
26 #include "fem_element2.h"
27 #include "fem_noeud.h"
28 #include "xfem_tetra4.h"
29 #include "ot_mathematique.h"
31 #include "fem_solution.h"
32 #include "fem_maillage.h"
33 #include "mg_gestionnaire.h"
34 #include <tpl_map_entite.h>
35 #include <tpl_liste_entite.h>
36 #include <math.h>
37 #include <stdio.h>
38 #include <string.h>
39 #include "ot_tenseur.h"
40 #include "fem_triangle3.h"
41 #include "fem_template_element.h"
42 #include "tpl_octree.h"
43 
44 
46 {
47 }
48 
50 {
51 }
52 
54 {
55 }
56 
57 
58 
59 
60 
61 
62 int FEM_MAILLAGE_OUTILS::projeteestdansletriangle(FEM_ELEMENT2 *tri,double x,double y, double z)
63 {
64 double *xyz1,*xyz2,*xyz3;
65 if (tri->get_nb_fem_noeud()==3)
66  {
67  xyz1=tri->get_fem_noeud(0)->get_coord();
68  xyz2=tri->get_fem_noeud(1)->get_coord();
69  xyz3=tri->get_fem_noeud(2)->get_coord();
70  }
71 if (tri->get_nb_fem_noeud()==6)
72  {
73  xyz1=tri->get_fem_noeud(0)->get_coord();
74  xyz2=tri->get_fem_noeud(2)->get_coord();
75  xyz3=tri->get_fem_noeud(4)->get_coord();
76  }
77 return OPERATEUR::projeteestdansletriangle(xyz1,xyz2,xyz3,x,y,z);
78 }
79 
80 int FEM_MAILLAGE_OUTILS::estdansletriangle(FEM_ELEMENT2 *tri,double x,double y, double z)
81 {
82 double *xyz1,*xyz2,*xyz3;
83 if (tri->get_nb_fem_noeud()==3)
84  {
85  xyz1=tri->get_fem_noeud(0)->get_coord();
86  xyz2=tri->get_fem_noeud(1)->get_coord();
87  xyz3=tri->get_fem_noeud(2)->get_coord();
88  }
89 if (tri->get_nb_fem_noeud()==6)
90  {
91  xyz1=tri->get_fem_noeud(0)->get_coord();
92  xyz2=tri->get_fem_noeud(2)->get_coord();
93  xyz3=tri->get_fem_noeud(4)->get_coord();
94  }
95 return OPERATEUR::estdansletriangle(xyz1,xyz2,xyz3,x,y,z);
96 }
97 
98 int FEM_MAILLAGE_OUTILS::estdansletetra(FEM_ELEMENT3 *tet,double x,double y, double z)
99 {
100 double *xyz1,*xyz2,*xyz3,*xyz4;
101 if (tet->get_nb_fem_noeud()==4)
102  {
103  xyz1=tet->get_fem_noeud(0)->get_coord();
104  xyz2=tet->get_fem_noeud(1)->get_coord();
105  xyz3=tet->get_fem_noeud(2)->get_coord();
106  xyz4=tet->get_fem_noeud(3)->get_coord();
107  }
108 if (tet->get_nb_fem_noeud()==10)
109  {
110  xyz1=tet->get_fem_noeud(0)->get_coord();
111  xyz2=tet->get_fem_noeud(2)->get_coord();
112  xyz3=tet->get_fem_noeud(4)->get_coord();
113  xyz4=tet->get_fem_noeud(9)->get_coord();
114  }
115 return OPERATEUR::estdansletetra(xyz1,xyz2,xyz3,xyz4,x,y,z);
116 }
117 
119 {
120 double *xyz1,*xyz2,*xyz3;
121 if (tri->get_nb_fem_noeud()==3)
122  {
123  xyz1=tri->get_fem_noeud(0)->get_coord();
124  xyz2=tri->get_fem_noeud(1)->get_coord();
125  xyz3=tri->get_fem_noeud(2)->get_coord();
126  }
127 if (tri->get_nb_fem_noeud()==6)
128  {
129  xyz1=tri->get_fem_noeud(0)->get_coord();
130  xyz2=tri->get_fem_noeud(2)->get_coord();
131  xyz3=tri->get_fem_noeud(4)->get_coord();
132  }
133 return OPERATEUR::projeteestdansletriangle(xyz1,xyz2,xyz3,x,y,z);
134 }
135 
136 
137 int FEM_MAILLAGE_OUTILS::estdansletriangle(XFEM_ELEMENT2 *tri,double x,double y, double z)
138 {
139 double *xyz1,*xyz2,*xyz3;
140 if (tri->get_nb_fem_noeud()==3)
141  {
142  xyz1=tri->get_fem_noeud(0)->get_coord();
143  xyz2=tri->get_fem_noeud(1)->get_coord();
144  xyz3=tri->get_fem_noeud(2)->get_coord();
145  }
146 if (tri->get_nb_fem_noeud()==6)
147  {
148  xyz1=tri->get_fem_noeud(0)->get_coord();
149  xyz2=tri->get_fem_noeud(2)->get_coord();
150  xyz3=tri->get_fem_noeud(4)->get_coord();
151  }
152 return OPERATEUR::estdansletriangle(xyz1,xyz2,xyz3,x,y,z);
153 }
154 
155 
156 
157 
158 int FEM_MAILLAGE_OUTILS::estdansletetra(XFEM_ELEMENT3 *tet,double x,double y, double z)
159 {
160 double *xyz1,*xyz2,*xyz3,*xyz4;
161 if (tet->get_nb_fem_noeud()==4)
162  {
163  xyz1=tet->get_fem_noeud(0)->get_coord();
164  xyz2=tet->get_fem_noeud(1)->get_coord();
165  xyz3=tet->get_fem_noeud(2)->get_coord();
166  xyz4=tet->get_fem_noeud(3)->get_coord();
167  }
168 if (tet->get_nb_fem_noeud()==10)
169  {
170  xyz1=tet->get_fem_noeud(0)->get_coord();
171  xyz2=tet->get_fem_noeud(2)->get_coord();
172  xyz3=tet->get_fem_noeud(4)->get_coord();
173  xyz4=tet->get_fem_noeud(9)->get_coord();
174  }
175 return OPERATEUR::estdansletetra(xyz1,xyz2,xyz3,xyz4,x,y,z);
176 
177 }
178 
179 
181 {
182 return OPERATEUR::compare_etat_tetra(etat,valeur);
183 }
184 
185 
187 {
188 return OPERATEUR::compare_etat_triangle(etat,valeur);
189 }
190 
191 
193 {
194  if (ele1->get_nb_fem_noeud()==3)
195  if (ele2->get_nb_fem_noeud()==3)
196  {
197  FEM_NOEUD* noeud1=ele1->get_fem_noeud(0);
198  FEM_NOEUD* noeud2=ele1->get_fem_noeud(1);
199  FEM_NOEUD* noeud3=ele1->get_fem_noeud(2);
200  FEM_NOEUD* noeud4=ele2->get_fem_noeud(0);
201  FEM_NOEUD* noeud5=ele2->get_fem_noeud(1);
202  FEM_NOEUD* noeud6=ele2->get_fem_noeud(2);
203  return get_angle_par_noeud<FEM_NOEUD*>(noeud1,noeud2,noeud3,noeud4,noeud5,noeud6);
204  }
205  return 0.;
206 }
207 
208 
210 {
212  gest.ajouter_fem_solution(sol);
213 
214  sol->change_legende(0,"Gauss");
215  sol->change_legende(1,"Moyenne");
216  sol->change_legende(2,"Maximale");
217  sol->change_legende(3,"Minimale");
218  sol->change_legende(4,"frontiere");
219 
220  int h=0;
221  LISTE_FEM_NOEUD::iterator it_no;
222  for (FEM_NOEUD* noeud=femmai->get_premier_noeud(it_no);noeud!=NULL;noeud=femmai->get_suivant_noeud(it_no))
223  {
224  if (noeud->get_lien_topologie()->get_dimension()==2)
225  {
226  int nb_ele2=noeud->get_lien_element2()->get_nb();
227  TPL_MAP_ENTITE<FEM_ELEMENT2*> liste_map_element2;
229  TPL_LISTE_ENTITE<FEM_ELEMENT2*> liste_tpl_element2;
230 
231  for (int k=0;k<nb_ele2;k++)
232  {
233  FEM_ELEMENT2* tri1=noeud->get_lien_element2()->get(k);
234  liste_map_element2.ajouter(tri1);
235  }
236 
237  FEM_ELEMENT2* tri2=liste_map_element2.get_premier(it);
238  FEM_NOEUD* na=tri2->get_fem_noeud(0);
239  FEM_NOEUD* nb=tri2->get_fem_noeud(1);
240  FEM_NOEUD* nc=tri2->get_fem_noeud(2);
241  FEM_NOEUD* n1=NULL;
242  FEM_NOEUD* n2=NULL;
243  FEM_NOEUD* n3=NULL;
244 
245  if (na==noeud) {n1=na;n2=nb;n3=nc;}
246  if (nb==noeud) {n1=nb;n2=nc;n3=na;}
247  if (nc==noeud) {n1=nc;n2=na;n3=nb;}
248 
249  liste_tpl_element2.ajouter(tri2);
250 
251  FEM_ELEMENT2* tri=NULL;
252  while (liste_map_element2.get_nb()!=liste_tpl_element2.get_nb())
253  for (tri=liste_map_element2.get_premier(it);tri;tri=liste_map_element2.get_suivant(it))
254  {
255  if (tri!=tri2)
256  {
257  FEM_NOEUD* noa=tri->get_fem_noeud(0);
258  FEM_NOEUD* nob=tri->get_fem_noeud(1);
259  FEM_NOEUD* noc=tri->get_fem_noeud(2);
260  FEM_NOEUD* n4=NULL;
261  FEM_NOEUD* n5=NULL;
262  FEM_NOEUD* n6=NULL;
263 
264  if (noa==noeud) {n4=noa;n5=nob;n6=noc;}
265  if (nob==noeud) {n4=nob;n5=noc;n6=noa;}
266  if (noc==noeud) {n4=noc;n5=noa;n6=nob;}
267 
268  if (n1==n4)
269  if (n3==n5)
270  {
271  liste_tpl_element2.ajouter(tri);
272  n1=n4;
273  n2=n5;
274  n3=n6;
275  if (liste_map_element2.get_nb()==liste_tpl_element2.get_nb()) break;
276  }
277  }
278  }
279 
280  double K=0.;
281  double H=0.;
282  double kM=0.;
283  double km=0.;
284 
285  double beta=0.;
286  double surface=0.;
287  double som1=0.;
288  double som2=0.;
289  double som3=0.;
290  double som4=0.;
291 
292  double def_ang=0.;
293 
294  for (int i=0;i<liste_tpl_element2.get_nb();i++)
295  {
296  FEM_ELEMENT2* tri00=NULL;
297  FEM_ELEMENT2* tri01=NULL;
298 
299  if (!(i==(liste_tpl_element2.get_nb()-1))) {tri00=liste_tpl_element2.get(i);tri01=liste_tpl_element2.get(i+1);}
300  if (i==(liste_tpl_element2.get_nb()-1)) {tri00=liste_tpl_element2.get(i);tri01=tri2;}
301 
302  FEM_NOEUD* noeud1=NULL;
303  FEM_NOEUD* noeud2=NULL;
304  FEM_NOEUD* noeud3=NULL;
305  FEM_NOEUD* noeud4=NULL;
306  FEM_NOEUD* noeud5=NULL;
307  FEM_NOEUD* noeud6=NULL;
308 
309  FEM_NOEUD* nd1=tri00->get_fem_noeud(0);
310  FEM_NOEUD* nd2=tri00->get_fem_noeud(1);
311  FEM_NOEUD* nd3=tri00->get_fem_noeud(2);
312  FEM_NOEUD* nd4=tri01->get_fem_noeud(0);
313  FEM_NOEUD* nd5=tri01->get_fem_noeud(1);
314  FEM_NOEUD* nd6=tri01->get_fem_noeud(2);
315 
316  if (nd1==noeud) {noeud1=nd1;noeud2=nd2;noeud3=nd3;}
317  if (nd2==noeud) {noeud1=nd2;noeud2=nd3;noeud3=nd1;}
318  if (nd3==noeud) {noeud1=nd3;noeud2=nd1;noeud3=nd2;}
319  if (nd4==noeud) {noeud4=nd4;noeud5=nd5;noeud6=nd6;}
320  if (nd5==noeud) {noeud4=nd5;noeud5=nd6;noeud6=nd4;}
321  if (nd6==noeud) {noeud4=nd6;noeud5=nd4;noeud6=nd5;}
322 
323  double *xyz1=noeud1->get_coord();
324  double *xyz2=noeud2->get_coord();
325  double *xyz3=noeud3->get_coord();
326  double *xyz4=noeud4->get_coord();
327  double *xyz5=noeud5->get_coord();
328  double *xyz6=noeud6->get_coord();
329 
330  OT_VECTEUR_3D vec1(xyz1,xyz2);
331  OT_VECTEUR_3D vec2(xyz1,xyz3);
332  OT_VECTEUR_3D vec3(xyz2,xyz3);
333  OT_VECTEUR_3D vec4(xyz4,xyz5);
334  OT_VECTEUR_3D vec5(xyz4,xyz6);
335  OT_VECTEUR_3D vec6(xyz5,xyz6);
336 
337 
338  // COURBURE GAUSSIENNE
339  // Calcul de alpha (i) de chaque triangle lié au noeud
340  double cosalpha=((vec1*vec2)/(vec1.get_longueur()*vec2.get_longueur()));
341  double alpha=acos(cosalpha);
342  double cotalpha=(cosalpha/sin(alpha));
343  som1=som1+alpha;
344 
345  // Calcul Aire triangle 1
346  OT_VECTEUR_3D pvec1=vec1&vec2;
347  surface=0.5*pvec1.get_longueur();
348  som2=som2+surface;
349 
350  // Calcul de I = longueur de l'arête opposée à l'angle alpha
351  double I=vec3.get_longueur();
352  som3=som3+(I*I*cotalpha);
353 
354  // COURBURE MOYENNE
355  // Calcul de la longueur de l'arête commune aux deux triangles adjacents tri00 et tri01
356  double L=vec2.get_longueur();
357 
358  // Calcul de beta, l'angle entre les normales de 2 triangles adjacents
360  beta=M_PI-ot.get_angle(tri00,tri01);
361  som4=som4+(beta*L);
362  }
363 
364  // Courbures de Gauss, Moyenne, Min et Max
365  K=((2.*M_PI-som1)/((0.5*som2)-(0.125*som3)));
366  H=((0.25*som4)/((0.5*som2)-(0.125*som3)));
367  if (H*H-K>0.) kM=H+sqrt((H)*(H)-(K)); else kM=H;
368  if (kM<0.000001) kM=0.;
369  if (H*H-K>0.) km=H-sqrt((H)*(H)-(K)); else km=H;
370  if (km>-0.000001) km=0.;
371 
372  // Solutions
373  sol->ecrire(K,h,0);
374  sol->ecrire(H,h,1);
375  sol->ecrire(kM,h,2);
376  sol->ecrire(km,h,3);
377  }
378 /*
379  // Calcul de la courbure sur les frontières
380  // Les courbures de Gauss et Moyenne (et donc les Min et Max aussi) étant inexistantes aux frontières,
381  // Calladine propose une approximation de la courbure de la courbe représentée par la frontière
382  if (noeud->get_lien_topologie()->get_dimension()==1)
383  {
384  FEM_ELEMENT1* seg1=noeud->get_lien_element1()->get(0);
385  FEM_ELEMENT1* seg2=noeud->get_lien_element1()->get(1);
386 
387  FEM_NOEUD* ned2=NULL;
388  FEM_NOEUD* ned3=NULL;
389 
390  FEM_NOEUD* nedX=NULL;
391  FEM_NOEUD* nedY=NULL;
392  FEM_NOEUD* nedZ=NULL;
393  FEM_NOEUD* nedT=NULL;
394 
395  nedX=seg1->get_fem_noeud(0);
396  nedY=seg1->get_fem_noeud(1);
397  nedZ=seg2->get_fem_noeud(0);
398  nedT=seg2->get_fem_noeud(1);
399 
400  if (nedX==noeud) ned2=nedY;
401  if (nedY==noeud) ned2=nedX;
402  if (nedZ==noeud) ned3=nedT;
403  if (nedT==noeud) ned3=nedZ;
404 
405  double *coord1=noeud->get_coord();
406  double *coord2=ned2->get_coord();
407  double *coord3=ned3->get_coord();
408 
409  OT_VECTEUR_3D vec1(coord1,coord2);
410  OT_VECTEUR_3D vec2(coord1,coord3);
411  double cosalpha=((vec1*vec2)/(vec1.get_longueur()*vec2.get_longueur()));
412  double alpha=acos(cosalpha);
413 
414  double L1=vec1.get_longueur();
415  double L2=vec2.get_longueur();
416  double L=0.;
417  if (L1>L2) L=L1;
418  else L=L2;
419  double Cf=((M_PI-alpha)/L);
420 
421  // Solutions
422  sol->ecrire(Cf,h,4);
423  }
424 */
425 
426  h++;
427  }
428 }
429 
430 
431 
433 {
434  double jac[9],j[9];
435  if ((tet->get_nb_fem_noeud()==4))
436  {
437  FEM_NOEUD* n1=tet->get_fem_noeud(0);
438  FEM_NOEUD* n2=tet->get_fem_noeud(1);
439  FEM_NOEUD* n3=tet->get_fem_noeud(2);
440  FEM_NOEUD* n4=tet->get_fem_noeud(3);
441  double *xyz1=n1->get_coord();
442  double *xyz2=n2->get_coord();
443  double *xyz3=n3->get_coord();
444  double *xyz4=n4->get_coord();
445  jac[0]=(xyz2[0]-xyz1[0]);
446  jac[1]=(xyz2[1]-xyz1[1]);
447  jac[2]=(xyz2[2]-xyz1[2]);
448  jac[3]=(xyz3[0]-xyz1[0]);
449  jac[4]=(xyz3[1]-xyz1[1]);
450  jac[5]=(xyz3[2]-xyz1[2]);
451  jac[6]=(xyz4[0]-xyz1[0]);
452  jac[7]=(xyz4[1]-xyz1[1]);
453  jac[8]=(xyz4[2]-xyz1[2]);
454  double detj=jac[0]*jac[4]*jac[8]+jac[3]*jac[7]*jac[2]+jac[6]*jac[1]*jac[5]-jac[2]*jac[4]*jac[6]-jac[5]*jac[7]*jac[0]-jac[8]*jac[1]*jac[3];
455 
456  j[0*3+0] = (jac[1*3+1]*jac[2*3+2]-jac[1*3+2]*jac[2*3+1])/(detj);
457  j[0*3+1] = -(jac[0*3+1]*jac[2*3+2]-jac[0*3+2]*jac[2*3+1])/(detj);
458  j[0*3+2] =-(-jac[0*3+1]*jac[1*3+2]+jac[0*3+2]*jac[1*3+1])/(detj);
459  j[1*3+0] = -(jac[1*3+0]*jac[2*3+2]-jac[1*3+2]*jac[2*3+0])/(detj);
460  j[1*3+1] = (jac[0*3+0]*jac[2*3+2]-jac[0*3+2]*jac[2*3+0])/(detj);
461  j[1*3+2] = -(jac[0*3+0]*jac[1*3+2]-jac[0*3+2]*jac[1*3+0])/(detj);
462  j[2*3+0] =-(-jac[1*3+0]*jac[2*3+1]+jac[1*3+1]*jac[2*3+0])/(detj);
463  j[2*3+1] = -(jac[0*3+0]*jac[2*3+1]-jac[0*3+1]*jac[2*3+0])/(detj);
464  j[2*3+2] = (jac[0*3+0]*jac[1*3+1]-jac[0*3+1]*jac[1*3+0])/(detj);
465 
466  //Gradient par element Design
467  double d0 = n1->get_solution();
468  double d1 = n2->get_solution();
469  double d2 = n3->get_solution();
470  double d3 = n4->get_solution();
471 
472  double gd_x = j[0*3+0]*(d1-d0)+j[0*3+1]*(d2-d0)+j[0*3+2]*(d3-d0);
473  double gd_y = j[1*3+0]*(d1-d0)+j[1*3+1]*(d2-d0)+j[1*3+2]*(d3-d0);
474  double gd_z = j[2*3+0]*(d1-d0)+j[2*3+1]*(d2-d0)+j[2*3+2]*(d3-d0);
475 
476  OT_VECTEUR_3D gd(gd_x,gd_y,gd_z);
477  return(gd.get_longueur());
478  }
479  return 0.;
480 }
481 
482 
483 
484 
485 
486 void FEM_MAILLAGE_OUTILS::compare_champs_solution(class FEM_SOLUTION* sol1, int numchamp1,FEM_SOLUTION* sol2,int numchamp2)
487 {
488 FEM_MAILLAGE* fem1=sol1->get_maillage();
489 FEM_MAILLAGE* fem2=sol2->get_maillage();
491 if (fem1!=fem2) return;
492 char nom[255];
493 sprintf(nom,"%s_%s-%s_%s",sol1->get_nom().c_str(),sol1->get_legende(numchamp1).c_str(),sol2->get_nom().c_str(),sol2->get_legende(numchamp1).c_str());
494 char nomfichier[255];
495 sprintf(nomfichier,"%s%d_diff_%d%s",sol1->get_nom_fichier().c_str(),numchamp1,numchamp2,sol2->get_nom_fichier().c_str());
497 sol3->change_legende(0,"Valeur");
498 sol3->change_legende(1,"|Valeur|");
499 gest->ajouter_fem_solution(sol3);
500 int numno=0;
501 LISTE_FEM_NOEUD::iterator it;
502 for (FEM_NOEUD* no=fem1->get_premier_noeud(it);no!=NULL;no=fem1->get_suivant_noeud(it))
503  {
504  double val1=sol1->lire(numno,numchamp1);
505  double val2=sol2->lire(numno,numchamp2);
506  double erreur=(val1-val2)/val2;
507  sol3->ecrire(erreur,numno,0);
508  sol3->ecrire(fabs(erreur),numno,1);
509  numno++;
510  }
511 }
512 
513 /*void FEM_MAILLAGE_OUTILS::operation_champs_solution(class FEM_SOLUTION* sol1, int numchamp1,FEM_SOLUTION* sol3,int numchamp3,int operation)
514 {
515 FEM_MAILLAGE* fem=sol1->get_maillage();
516 sol1->active_solution(numchamp1);
517 int ligne=0;
518 int dim=sol1->get_dim_solution();
519 
520 if (operation==MAGIC::OPERATION_FEM_SOLUTION::EXTRAPOLATION)
521  {
522  LISTE_FEM_NOEUD::iterator itn;
523  for (FEM_NOEUD* no=fem->get_premier_noeud(itn);no!=NULL;no=fem->get_suivant_noeud(itn))
524  for (int i=0;i<dim;i++)
525  no->change_solution(0.,i);
526  }
527 if ((operation==MAGIC::OPERATION_FEM_SOLUTION::EXTRAPOLATION) || (operation==MAGIC::OPERATION_FEM_SOLUTION::GRAD))
528 {
529  LISTE_FEM_ELEMENT2::iterator it;
530  for (FEM_ELEMENT2 *ele=fem->get_premier_element2(it);ele!=NULL;ele=fem->get_suivant_element2(it))
531  {
532  int nb=ele->get_nb_fem_noeud();
533  double x=0,y=0,z=0;
534  double uv[2];
535  if ((operation==MAGIC::OPERATION_FEM_SOLUTION::GRAD) && (dim==1))
536  {
537  for (int i=0;i<nb;i++)
538  {
539  x=x+ele->get_fonction_derive_interpolation(i+1,1,uv)*ele->get_fem_noeud(i)->get_solution();
540  y=y+ele->get_fonction_derive_interpolation(i+1,2,uv)*ele->get_fem_noeud(i)->get_solution();
541  //z=z+ele->get_fonction_derive_interpolation(i+1,2,uv)*ele->get_fem_noeud(i)->get_solution();
542  }
543  double jacinv[9];
544  double unite=1.;
545  if (fem->get_mg_geometrie()!=NULL) unite=fem->get_mg_geometrie()->get_valeur_unite();
546  ele->get_inverse_jacob(jacinv,uv,unite);
547  double xx=jacinv[0]*x+jacinv[1]*y+jacinv[2]*z;
548  double yy=jacinv[3]*x+jacinv[4]*y+jacinv[5]*z;
549  double zz=jacinv[6]*x+jacinv[7]*y+jacinv[8]*z;
550  sol3->ecrire(xx,ligne,numchamp3,0);
551  sol3->ecrire(yy,ligne,numchamp3,1);
552  sol3->ecrire(zz,ligne,numchamp3,2);
553  ligne++;
554  }
555  if ((operation==MAGIC::OPERATION_FEM_SOLUTION::GRAD) && (dim==3))
556  {
557  for (int j=0;j<3;j++)
558  {
559  for (int i=0;i<nb;i++)
560  {
561  x=x+ele->get_fonction_derive_interpolation(i+1,1,uv)*ele->get_fem_noeud(i)->get_solution(j);
562  y=y+ele->get_fonction_derive_interpolation(i+1,2,uv)*ele->get_fem_noeud(i)->get_solution(j);
563  //z=z+ele->get_fonction_derive_interpolation(i+1,2,uv)*ele->get_fem_noeud(i)->get_solution();
564  }
565  double jacinv[9];
566  double unite=1.;
567  if (fem->get_mg_geometrie()!=NULL) unite=fem->get_mg_geometrie()->get_valeur_unite();
568  ele->get_inverse_jacob(jacinv,uv,unite);
569  double xx=jacinv[0]*x+jacinv[1]*y+jacinv[2]*z;
570  double yy=jacinv[3]*x+jacinv[4]*y+jacinv[5]*z;
571  double zz=jacinv[6]*x+jacinv[7]*y+jacinv[8]*z;
572  sol3->ecrire(xx,ligne,numchamp3,0,3*j);
573  sol3->ecrire(yy,ligne,numchamp3,1,3*j+1);
574  sol3->ecrire(zz,ligne,numchamp3,2,3*j+2);
575  }
576  ligne++;
577  }
578  if (operation==MAGIC::OPERATION_FEM_SOLUTION::EXTRAPOLATION)
579  {
580  for (int i=0;i<nb;i++)
581  for (int j=0;j<dim;j++)
582  ele->get_fem_noeud(i)->change_solution(ele->get_fem_noeud(i)->get_solution(j)+ele->get_solution(j),j);
583  }
584  }
585 }
586 if (operation==MAGIC::OPERATION_FEM_SOLUTION::EXTRAPOLATION)
587  {
588  LISTE_FEM_NOEUD::iterator itn;
589  for (FEM_NOEUD* no=fem->get_premier_noeud(itn);no!=NULL;no=fem->get_suivant_noeud(itn))
590  {
591  for (int i=0;i<dim;i++)
592  {
593  no->change_solution(no->get_solution(i)/no->get_lien_element2()->get_nb(),i);
594  sol3->ecrire(no->get_solution(i),ligne,numchamp3,i);
595 
596  }
597  ligne++;
598 
599  }
600  }
601 if (operation==MAGIC::OPERATION_FEM_SOLUTION::NORMESUP)
602 {
603 sol1->active_solution(numchamp1);
604 if (sol1->get_entite_solution()==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2)
605  {
606  LISTE_FEM_ELEMENT2::iterator it;
607  for (FEM_ELEMENT2 *ele=fem->get_premier_element2(it);ele!=NULL;ele=fem->get_suivant_element2(it))
608  {
609  double max=fabs(ele->get_solution(0));
610  for (int i=1;i<dim;i++)
611  if (fabs(ele->get_solution(i))>max)
612  max=fabs(ele->get_solution(i));
613  sol3->ecrire(max,ligne,numchamp3);
614  ligne++;
615  }
616  }
617 }
618 
619 }
620 */
621 
622 void FEM_MAILLAGE_OUTILS::operation_champs_solution(class FEM_SOLUTION* sol1, int numchamp1,FEM_SOLUTION* sol2,int numchamp2,FEM_SOLUTION* sol3,int numchamp3,int operation)
623 {
624 FEM_MAILLAGE* fem1=sol1->get_maillage();
625 FEM_MAILLAGE* fem2=sol2->get_maillage();
627 if (fem1!=fem2) return;
628 int numno=0;
629 LISTE_FEM_NOEUD::iterator it;
630 for (FEM_NOEUD* no=fem1->get_premier_noeud(it);no!=NULL;no=fem1->get_suivant_noeud(it))
631  {
632  double val1=sol1->lire(numno,numchamp1);
633  double val2=sol2->lire(numno,numchamp2);
634  double val;
635  switch (operation)
636  {
638  val=val1+val2;
639  break;
641  val=val1-val2;
642  break;
644  val=val1*val2;
645  break;
647  val=val1/val2;
648  break;
650  val=fabs(val1-val2);
651  break;
653  val=fabs(val1-val2)/val1;
654  break;
656  val=fabs(val1);
657  break;
658  }
659  sol3->ecrire(val,numno,numchamp3);
660  numno++;
661  }
662 }
663 
664 
666 {
668 int dimdest;
669 if (fem->get_nb_fem_element3()!=0) dimdest=3;
670 else if (fem->get_nb_fem_element2()!=0) dimdest=2;
671 else if (fem->get_nb_fem_element1()!=0) dimdest=1;
672 int dimori=0;
673 if (sol->get_maillage()->get_nb_fem_element3()!=0) dimori=3;
674 else if (sol->get_maillage()->get_nb_fem_element2()!=0) dimori=2;
675 else if (sol->get_maillage()->get_nb_fem_element1()!=0) dimori=1;
676 if (dimdest!=dimori) return MAGIC::PROJECTION::DIMENSION_MAILLAGE_INCOMPATIBLE;
677 if (dimdest<2) return MAGIC::PROJECTION::NON_IMPLEMENTER;
678 if (dimdest==2) return projete_solution_maillage_2D(sol,numchamp,fem);
679 if (dimdest==3) return projete_solution_maillage_3D(sol,numchamp,fem);
680 return 0;
681 }
682 
683 
685 {
686 sol->active_solution(numchamp);
687 FEM_MAILLAGE* fem1=sol->get_maillage();
689 LISTE_FEM_NOEUD::iterator it;
690 double xmin=1e308,ymin=1e308,zmin=1e308;
691 double xmax=-1e308,ymax=-1e308,zmax=-1e308;
692 for (FEM_NOEUD* no=fem1->get_premier_noeud(it);no!=NULL;no=fem1->get_suivant_noeud(it))
693  {
694  lstnoeud.ajouter(no);
695  if (no->get_x()>xmax) xmax=no->get_x();
696  if (no->get_y()>ymax) ymax=no->get_y();
697  if (no->get_z()>zmax) zmax=no->get_z();
698  if (no->get_x()<xmin) xmin=no->get_x();
699  if (no->get_y()<ymin) ymin=no->get_y();
700  if (no->get_z()<zmin) zmin=no->get_z();
701  }
702 
703 BOITE_3D boite(xmin,ymin,zmin,xmax,ymax,zmax);
704 boite.change_grosseur(1.1);
706 oct.initialiser2D(3,&lstnoeud,1,boite.get_xmin(),boite.get_ymin(),boite.get_zmin(),boite.get_xmax(),boite.get_ymax(),boite.get_zmax());
707 
708 LISTE_FEM_ELEMENT2::iterator ite;
709 for (FEM_ELEMENT2* ele=fem1->get_premier_element2(ite);ele!=NULL;ele=fem1->get_suivant_element2(ite))
710  oct.inserer(ele);
711 
712 char nom[255];
713 sprintf(nom,"%sproj",sol->get_nom().c_str());
714 char nomfichier[255];
715 sprintf(nomfichier,"%sproj%lu",sol->get_nom_fichier().c_str(),fem->get_id());
716 
717 int dimsol=sol->get_dim_solution();
718 FEM_SOLUTION *sol2=new FEM_SOLUTION(fem,1,nomfichier,1,nom,MAGIC::ENTITE_SOLUTION::ENTITE_NOEUD,dimsol);
720 sol2->change_legende(0,sol->get_legende(numchamp).c_str());
721 int numno=0;
722 for (FEM_NOEUD* no=fem->get_premier_noeud(it);no!=NULL;no=fem->get_suivant_noeud(it))
723  {
724  TPL_MAP_ENTITE<FEM_ELEMENT2*> rechercheele;
725  oct.rechercher(no->get_x(),no->get_y(),no->get_z(),0.,rechercheele);
728  bool passe=false;
729  for (FEM_ELEMENT2* ele2=rechercheele.get_premier(itele);ele2!=NULL;ele2=rechercheele.get_suivant(itele))
730  {
731  double uv[2];
732  bool res=ele2->get_param_element_fini_2D(no->get_coord(),uv);
733  if (res==true)
734  if (ele2->valide_parametre_EF(uv)==true)
735  {
736  double *sol1val=new double[dimsol];
737  for (int j=0;j<dimsol;j++)
738  sol1val[j]=0.;
739  for (int i=0;i<ele2->get_nb_fem_noeud();i++)
740  {
741  double interpol=ele2->get_fonction_interpolation(i+1,uv);
742  for (int j=0;j<dimsol;j++)
743  sol1val[j]=sol1val[j]+interpol*ele2->get_fem_noeud(i)->get_solution(j);
744 
745 
746  }
747  for (int j=0;j<dimsol;j++)
748  sol2->ecrire(sol1val[j],numno,0,j);
749  delete [] sol1val;
750  passe=true;
751  }
752  }
753  if (passe==false)
754  {
755  std::cerr << "non projete " <<std::endl;
756  }
757  numno++;
758  }
760 }
761 
762 
764 {
765 sol->active_solution(numchamp);
766 FEM_MAILLAGE* fem1=sol->get_maillage();
768 LISTE_FEM_NOEUD::iterator it;
769 double xmin=1e308,ymin=1e308,zmin=1e308;
770 double xmax=-1e308,ymax=-1e308,zmax=-1e308;
771 for (FEM_NOEUD* no=fem1->get_premier_noeud(it);no!=NULL;no=fem1->get_suivant_noeud(it))
772  {
773  lstnoeud.ajouter(no);
774  if (no->get_x()>xmax) xmax=no->get_x();
775  if (no->get_y()>ymax) ymax=no->get_y();
776  if (no->get_z()>zmax) zmax=no->get_z();
777  if (no->get_x()<xmin) xmin=no->get_x();
778  if (no->get_y()<ymin) ymin=no->get_y();
779  if (no->get_z()<zmin) zmin=no->get_z();
780  }
781 
782 BOITE_3D boite(xmin,ymin,zmin,xmax,ymax,zmax);
783 boite.change_grosseur(1.1);
785 oct.initialiser(&lstnoeud,1,boite.get_xmin(),boite.get_ymin(),boite.get_zmin(),boite.get_xmax(),boite.get_ymax(),boite.get_zmax());
786 LISTE_FEM_ELEMENT3::iterator ite;
787 for (FEM_ELEMENT3* ele=fem1->get_premier_element3(ite);ele!=NULL;ele=fem1->get_suivant_element3(ite))
788  oct.inserer(ele);
789 
790 char nom[255];
791 sprintf(nom,"%sproj",sol->get_nom().c_str());
792 char nomfichier[255];
793 sprintf(nomfichier,"%sproj%lu",sol->get_nom_fichier().c_str(),fem->get_id());
794 
795 int dimsol=sol->get_dim_solution();
796 FEM_SOLUTION *sol2=new FEM_SOLUTION(fem,1,nomfichier,1,nom,MAGIC::ENTITE_SOLUTION::ENTITE_NOEUD,dimsol);
798 sol2->change_legende(0,sol->get_legende(numchamp).c_str());
799 int numno=0;
800 for (FEM_NOEUD* no=fem->get_premier_noeud(it);no!=NULL;no=fem->get_suivant_noeud(it))
801  {
802  TPL_MAP_ENTITE<FEM_ELEMENT3*> rechercheele;
803  oct.rechercher(no->get_x(),no->get_y(),no->get_z(),0.,rechercheele);
805  bool passe=false;
806  int num=rechercheele.get_nb();
807  for (FEM_ELEMENT3* ele3=rechercheele.get_premier(itele);ele3!=NULL;ele3=rechercheele.get_suivant(itele))
808  {
809  double uv[3];
810  bool res=ele3->get_param_element_fini(no->get_coord(),uv);
811  if (res==false) std::cout << " non convergence " << std::endl;
812  if (res==true)
813  if (ele3->valide_parametre_EF(uv)==true)
814  {
815  double *sol1val=new double[dimsol];
816  for (int j=0;j<dimsol;j++)
817  sol1val[j]=0.;
818  for (int i=0;i<ele3->get_nb_fem_noeud();i++)
819  {
820  double interpol=ele3->get_fonction_interpolation(i+1,uv);
821  for (int j=0;j<dimsol;j++)
822  sol1val[j]=sol1val[j]+interpol*ele3->get_fem_noeud(i)->get_solution(j);
823 
824 
825  }
826  for (int j=0;j<dimsol;j++)
827  sol2->ecrire(sol1val[j],numno,0,j);
828  delete [] sol1val;
829  passe=true;
830  }
831  }
832  if (passe==false)
833  {
834  std::cerr << "non projete " <<std::endl;
835  }
836  numno++;
837  }
839 }
MAGIC::OPERATION_FEM_SOLUTION::DIVISION
@ DIVISION
Definition: mg_definition.h:128
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
FEM_SOLUTION
Definition: fem_solution.h:40
FEM_MAILLAGE::get_suivant_element3
FEM_ELEMENT3 * get_suivant_element3(LISTE_FEM_ELEMENT3::iterator &it)
Definition: fem_maillage.cpp:680
FEM_MAILLAGE_OUTILS::estdansletriangle
int estdansletriangle(class XFEM_ELEMENT2 *tri, double x, double y, double z)
Definition: fem_maillage_outils.cpp:137
XFEM_ELEMENT2
Definition: xfem_element2.h:34
tpl_fonctions_generiques.h
FEM_SOLUTION::get_legende
std::string get_legende(int num)
Definition: fem_solution.cpp:462
gestionversion.h
TPL_MAP_ENTITE
Definition: tpl_map_entite.h:35
XFEM_ELEMENT3
Definition: xfem_element3.h:34
BOITE_3D::get_xmin
double get_xmin(void)
Definition: ot_boite_3d.cpp:104
fem_solution.h
mg_gestionnaire.h
FEM_ELEMENT3::get_fem_noeud
virtual class FEM_NOEUD * get_fem_noeud(int num)=0
MG_IDENTIFICATEUR::get_id
unsigned long get_id()
Definition: mg_identificateur.cpp:53
FEM_SOLUTION::ecrire
void ecrire(double val, int i, int j, int coord=0, int num_no=0)
Definition: fem_solution.cpp:411
fem_maillage.h
OPERATEUR::projeteestdansletriangle
static int projeteestdansletriangle(double *xyz1, double *xyz2, double *xyz3, double x, double y, double z)
Definition: ot_mathematique.cpp:1748
FEM_MAILLAGE_OUTILS::calcul_courbure
void calcul_courbure(class FEM_MAILLAGE *femmai, class MG_GESTIONNAIRE &gest, char *nom)
Definition: fem_maillage_outils.cpp:209
fem_noeud.h
MAGIC::OPERATION_FEM_SOLUTION::VALEUR_ABSOLUE
@ VALEUR_ABSOLUE
Definition: mg_definition.h:128
FEM_ELEMENT3
Definition: fem_element3.h:34
FEM_MAILLAGE::get_premier_noeud
FEM_NOEUD * get_premier_noeud(LISTE_FEM_NOEUD::iterator &it)
Definition: fem_maillage.cpp:174
OPERATEUR::compare_etat_triangle
static int compare_etat_triangle(int etat, int valeur)
Definition: ot_mathematique.cpp:1857
FEM_MAILLAGE_OUTILS::projete_solution_maillage
int projete_solution_maillage(class FEM_SOLUTION *sol, int numchamp, FEM_MAILLAGE *fem)
Definition: fem_maillage_outils.cpp:665
FEM_SOLUTION::get_nom_fichier
std::string get_nom_fichier(void)
Definition: fem_solution.cpp:839
FEM_SOLUTION::get_dim_solution
int get_dim_solution(void)
Definition: fem_solution.cpp:486
OPERATEUR::estdansletetra
static int estdansletetra(double *xyz1, double *xyz2, double *xyz3, double *xyz4, double x, double y, double z)
Definition: ot_mathematique.cpp:1709
FEM_MAILLAGE_OUTILS::operation_champs_solution
void operation_champs_solution(class FEM_SOLUTION *sol1, int numchamp1, FEM_SOLUTION *sol2, int numchamp2, FEM_SOLUTION *sol3, int numchamp3, int operation)
Definition: fem_maillage_outils.cpp:622
mg_element_maillage.h
MG_GESTIONNAIRE
Definition: mg_gestionnaire.h:57
FEM_SOLUTION::get_maillage
FEM_MAILLAGE * get_maillage(void)
Definition: fem_solution.cpp:472
MG_GESTIONNAIRE::ajouter_fem_solution
int ajouter_fem_solution(FEM_SOLUTION *mgsol)
Definition: mg_gestionnaire.cpp:902
FEM_MAILLAGE_OUTILS::compare_champs_solution
void compare_champs_solution(class FEM_SOLUTION *sol1, int numchamp1, FEM_SOLUTION *sol2, int numchamps2)
Definition: fem_maillage_outils.cpp:486
TPL_OCTREE::initialiser2D
virtual void initialiser2D(int dimanepasdecouper, TPL_LISTE_ENTITE< CONDITION > *lst_entite, int nombre, double xmin, double ymin, double zmin, double xmax, double ymax, double zmax)
Definition: tpl_octree.h:432
FEM_ELEMENT2
Definition: fem_element2.h:34
xfem_tetra4.h
FEM_MAILLAGE::get_mg_maillage
MG_MAILLAGE * get_mg_maillage(void)
Definition: fem_maillage.cpp:93
XFEM_ELEMENT3::get_nb_fem_noeud
virtual int get_nb_fem_noeud(void)=0
FEM_MAILLAGE::get_premier_element2
FEM_ELEMENT2 * get_premier_element2(LISTE_FEM_ELEMENT2::iterator &it)
Definition: fem_maillage.cpp:561
MAGIC::PROJECTION::SUCCES
@ SUCCES
Definition: mg_definition.h:169
TPL_OCTREE::inserer
virtual void inserer(BOITE_3D &boite, A a, TPL_CELLULE_OCTREE< A, CONDITION > *cellule)
Definition: tpl_octree.h:897
BOITE_3D::get_zmax
double get_zmax(void)
Definition: ot_boite_3d.cpp:129
BOITE_3D::get_ymin
double get_ymin(void)
Definition: ot_boite_3d.cpp:114
OPERATEUR::compare_etat_tetra
static int compare_etat_tetra(int etat, int valeur)
Definition: ot_mathematique.cpp:1828
FEM_NOEUD::get_coord
virtual double * get_coord(void)
Definition: fem_noeud.cpp:254
FEM_ELEMENT2::get_nb_fem_noeud
virtual int get_nb_fem_noeud(void)=0
FEM_SOLUTION::active_solution
void active_solution(int num)
Definition: fem_solution.cpp:490
FEM_MAILLAGE_OUTILS::compare_etat_tetra
int compare_etat_tetra(int etat, int valeur)
Definition: fem_maillage_outils.cpp:180
FEM_MAILLAGE_OUTILS::get_angle
double get_angle(class FEM_ELEMENT2 *ele1, class FEM_ELEMENT2 *ele2)
Definition: fem_maillage_outils.cpp:192
XFEM_ELEMENT2::get_fem_noeud
virtual class FEM_NOEUD * get_fem_noeud(int num)=0
FEM_MAILLAGE_OUTILS::FEM_MAILLAGE_OUTILS
FEM_MAILLAGE_OUTILS()
Definition: fem_maillage_outils.cpp:45
FEM_NOEUD::get_solution
virtual double get_solution(int num=0)
Definition: fem_noeud.cpp:364
BOITE_3D::get_xmax
double get_xmax(void)
Definition: ot_boite_3d.cpp:109
FEM_MAILLAGE
Definition: fem_maillage.h:66
TPL_MAP_ENTITE::get_nb
virtual int get_nb(void)
Definition: tpl_map_entite.h:83
FEM_MAILLAGE_OUTILS::compare_etat_triangle
int compare_etat_triangle(int etat, int valeur)
Definition: fem_maillage_outils.cpp:186
FEM_MAILLAGE::get_nb_fem_element2
unsigned int get_nb_fem_element2(void)
Definition: fem_maillage.cpp:494
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
TPL_LISTE_ENTITE::ajouter
virtual void ajouter(X x)
Definition: tpl_liste_entite.h:38
tpl_map_entite.h
TPL_MAP_ENTITE::ITERATEUR
std::map< unsigned long, X, std::less< unsigned long > >::iterator ITERATEUR
Definition: tpl_map_entite.h:38
MAGIC::OPERATION_FEM_SOLUTION::SOUSTRACTION
@ SOUSTRACTION
Definition: mg_definition.h:128
FEM_ELEMENT3::get_nb_fem_noeud
virtual int get_nb_fem_noeud(void)=0
FEM_MAILLAGE::get_nb_fem_element3
unsigned int get_nb_fem_element3(void)
Definition: fem_maillage.cpp:605
MAGIC::OPERATION_FEM_SOLUTION::COMPARAISON_RELATIVE
@ COMPARAISON_RELATIVE
Definition: mg_definition.h:128
TPL_LISTE_ENTITE::get_nb
virtual int get_nb(void)
Definition: tpl_liste_entite.h:67
tpl_octree.h
FEM_MAILLAGE::get_suivant_element2
FEM_ELEMENT2 * get_suivant_element2(LISTE_FEM_ELEMENT2::iterator &it)
Definition: fem_maillage.cpp:569
MAGIC::OPERATION_FEM_SOLUTION::MULTIPLICATION
@ MULTIPLICATION
Definition: mg_definition.h:128
FEM_SOLUTION::lire
double lire(int i, int j, int coord=0, int num_no=0)
Definition: fem_solution.cpp:398
FEM_SOLUTION::get_nom
std::string get_nom(void)
Definition: fem_solution.cpp:834
TPL_LISTE_ENTITE::get
virtual X get(int num)
Definition: tpl_liste_entite.h:72
ot_mathematique.h
BOITE_3D::get_ymax
double get_ymax(void)
Definition: ot_boite_3d.cpp:119
FEM_NOEUD
Definition: fem_noeud.h:35
acos
double2 acos(double2 &val)
Definition: ot_doubleprecision.cpp:224
OT_VECTEUR_3D
Definition: ot_mathematique.h:94
TPL_MAP_ENTITE::ajouter
virtual void ajouter(X x)
Definition: tpl_map_entite.h:55
FEM_MAILLAGE_OUTILS::projete_solution_maillage_2D
int projete_solution_maillage_2D(class FEM_SOLUTION *sol, int numchamp, FEM_MAILLAGE *fem)
Definition: fem_maillage_outils.cpp:684
ot_tenseur.h
BOITE_3D
Definition: ot_boite_3d.h:27
FEM_MAILLAGE_OUTILS::get_gradient_element
double get_gradient_element(FEM_ELEMENT3 *tet)
Definition: fem_maillage_outils.cpp:432
FEM_MAILLAGE_OUTILS
Definition: fem_maillage_outils.h:56
sqrt
double2 sqrt(double2 &val)
Definition: ot_doubleprecision.cpp:345
MG_MAILLAGE::get_gestionnaire
MG_GESTIONNAIRE * get_gestionnaire(void)
Definition: mg_maillage.cpp:2658
fem_element2.h
MAGIC::PROJECTION::NON_IMPLEMENTER
@ NON_IMPLEMENTER
Definition: mg_definition.h:169
fem_tetra4.h
FEM_ELEMENT2::get_fem_noeud
virtual class FEM_NOEUD * get_fem_noeud(int num)=0
FEM_MAILLAGE_OUTILS::estdansletetra
int estdansletetra(class XFEM_ELEMENT3 *tet, double x, double y, double z)
Definition: fem_maillage_outils.cpp:158
FEM_MAILLAGE_OUTILS::~FEM_MAILLAGE_OUTILS
~FEM_MAILLAGE_OUTILS()
Definition: fem_maillage_outils.cpp:53
BOITE_3D::get_zmin
double get_zmin(void)
Definition: ot_boite_3d.cpp:124
fem_triangle3.h
OPERATEUR::estdansletriangle
static int estdansletriangle(double *xyz1, double *xyz2, double *xyz3, double x, double y, double z)
Definition: ot_mathematique.cpp:1802
OT_VECTEUR_3D::get_longueur
virtual double get_longueur(void) const
Definition: ot_mathematique.cpp:483
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_template_element.h
MAGIC::PROJECTION::DIMENSION_MAILLAGE_INCOMPATIBLE
@ DIMENSION_MAILLAGE_INCOMPATIBLE
Definition: mg_definition.h:169
res
#define res(i, j)
FEM_MAILLAGE_OUTILS::projete_solution_maillage_3D
int projete_solution_maillage_3D(class FEM_SOLUTION *sol, int numchamp, FEM_MAILLAGE *fem)
Definition: fem_maillage_outils.cpp:763
MAGIC::PROJECTION::TYPE_SOLUTION_INCORRECT
@ TYPE_SOLUTION_INCORRECT
Definition: mg_definition.h:169
MAGIC::OPERATION_FEM_SOLUTION::ADDITION
@ ADDITION
Definition: mg_definition.h:128
BOITE_3D::change_grosseur
void change_grosseur(double f)
Definition: ot_boite_3d.cpp:176
MAGIC::TYPE_SOLUTION::SCALAIRE
@ SCALAIRE
Definition: mg_definition.h:93
TPL_MAP_ENTITE::get_suivant
virtual X get_suivant(ITERATEUR &it)
Definition: tpl_map_entite.h:120
XFEM_ELEMENT2::get_nb_fem_noeud
virtual int get_nb_fem_noeud(void)=0
MAGIC::OPERATION_FEM_SOLUTION::COMPARAISON
@ COMPARAISON
Definition: mg_definition.h:128
tpl_liste_entite.h
FEM_SOLUTION::change_legende
void change_legende(int num, std::string val)
Definition: fem_solution.cpp:457
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
FEM_SOLUTION::get_entite_solution
int get_entite_solution(void)
Definition: fem_solution.cpp:393
TPL_OCTREE< FEM_ELEMENT2 *, FEM_NOEUD * >
FEM_MAILLAGE::get_nb_fem_element1
unsigned int get_nb_fem_element1(void)
Definition: fem_maillage.cpp:382
FEM_MAILLAGE::get_premier_element3
FEM_ELEMENT3 * get_premier_element3(LISTE_FEM_ELEMENT3::iterator &it)
Definition: fem_maillage.cpp:672
fem_maillage_outils.h
FEM_MAILLAGE_OUTILS::projeteestdansletriangle
int projeteestdansletriangle(class XFEM_ELEMENT2 *tri, double x, double y, double z)
Definition: fem_maillage_outils.cpp:118
MAGIC::ENTITE_SOLUTION::ENTITE_NOEUD
@ ENTITE_NOEUD
Definition: mg_definition.h:86
sin
double2 sin(double2 &val)
Definition: ot_doubleprecision.cpp:250