MAGiC  V5.0
Mailleurs Automatiques de Géometries intégrés à la Cao
fem_solution.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_solution.cpp
15 //####//
16 //####//------------------------------------------------------------
17 //####//------------------------------------------------------------
18 //####// COPYRIGHT 2000-2024
19 //####// jeu 13 jun 2024 11:58:54 EDT
20 //####//------------------------------------------------------------
21 //####//------------------------------------------------------------
22 
23 
24 #include "gestionversion.h"
25 #include <math.h>
26 #include <iostream>
27 #include <stdlib.h>
28 #include <string.h>
29 
30 #include "fem_solution.h"
31 #include "fem_maillage.h"
32 #include "mg_geometrie.h"
33 #include "ot_mathematique.h"
34 #include "ot_boite_3d.h"
35 
36 
37 #include <stdio.h> // pour la fonction remove() qui remplace DeleteFile
38 
39 
40 
41 
42 
43 
44 FEM_SOLUTION::FEM_SOLUTION(FEM_MAILLAGE* mai,int nb,char* chemin,int code,std::string nomsol,int entite,int type_solution):MG_IDENTIFICATEUR(),nb_champs(nb),femmai(mai),nomsolution(nomsol),typeentite(entite),dim_solution(type_solution),change_gauss(false)
45 {
46 inisolution(chemin,code);
47 }
48 
49 FEM_SOLUTION::FEM_SOLUTION(unsigned long num,FEM_MAILLAGE* mai,int nb,char* chemin,int code,std::string nomsol,int entite,int type_solution):MG_IDENTIFICATEUR(num),nb_champs(nb),femmai(mai),nomsolution(nomsol),typeentite(entite),dim_solution(type_solution),change_gauss(false)
50 {
51 inisolution(chemin,code);
52 
53 }
54 
55 void FEM_SOLUTION::inisolution(char* chemin,int code)
56 {
57  nom_fichier=new char[strlen(chemin)+2];
58  legende=new std::string[nb_champs];
59  for (int i=0;i<nb_champs;i++)
60  {
61  char mess[15];
62  sprintf(mess,"Champs_%d",i);
63  legende[i]=mess ;
64  }
65  strcpy(nom_fichier,chemin);
66  if (code!=0)
67  {
68  in=fopen(nom_fichier,"wb");
69  unsigned long nbele=0;
82  fwrite(&nbele,sizeof(unsigned long),1,in);
83  for (unsigned long i=0;i<nbele+1;i++)
84  {
85  unsigned long val=0;
86  fwrite(&val,sizeof(unsigned long),1,in);
87  }
88  unsigned long *tab=new unsigned long[nbele+1];
89  unsigned long i=0;
90  unsigned long cumul_iter=0;
92  {
93  LISTE_FEM_NOEUD::iterator ite;
94  for (FEM_NOEUD* ele=femmai->get_premier_noeud(ite);ele;ele=femmai->get_suivant_noeud(ite))
95  {
96  tab[i]=cumul_iter;
97  unsigned long iter=1*nb_champs*dim_solution;
98  for (unsigned long j=0;j<iter;j++)
99  {
100  double val=0;
101  fwrite(&val,sizeof(double),1,in);
102  }
103  i++;
104  cumul_iter=cumul_iter+iter;
105  }
106 
107  }
109  {
110  LISTE_FEM_ELEMENT1::iterator ite;
112  {
113  tab[i]=cumul_iter;
114  unsigned long iter=1*nb_champs*dim_solution;
115  for (unsigned long j=0;j<iter;j++)
116  {
117  double val=0;
118  fwrite(&val,sizeof(double),1,in);
119  }
120  i++;
121  cumul_iter=cumul_iter+iter;
122  }
123 
124  }
126  {
127  LISTE_FEM_ELEMENT2::iterator ite;
129  {
130  tab[i]=cumul_iter;
131  unsigned long iter=1*nb_champs*dim_solution;
132  for (unsigned long j=0;j<iter;j++)
133  {
134  double val=0;
135  fwrite(&val,sizeof(double),1,in);
136  }
137  i++;
138  cumul_iter=cumul_iter+iter;
139  }
140 
141  }
143  {
144  LISTE_FEM_ELEMENT3::iterator ite;
146  {
147  tab[i]=cumul_iter;
148  unsigned long iter=1*nb_champs*dim_solution;
149  for (unsigned long j=0;j<iter;j++)
150  {
151  double val=0;
152  fwrite(&val,sizeof(double),1,in);
153  }
154  i++;
155  cumul_iter=cumul_iter+iter;
156  }
157 
158  }
160  {
161  LISTE_FEM_ELEMENT1::iterator ite;
163  {
164  tab[i]=cumul_iter;
165  unsigned long iter=1*nb_champs*dim_solution;
166  for (unsigned long j=0;j<iter;j++)
167  {
168  double val=0;
169  fwrite(&val,sizeof(double),1,in);
170  }
171  i++;
172  cumul_iter=cumul_iter+iter;
173  }
174 
175  LISTE_FEM_ELEMENT2::iterator ite2;
176  for (FEM_ELEMENT2* ele=femmai->get_premier_element2(ite2);ele;ele=femmai->get_suivant_element2(ite2))
177  {
178  tab[i]=cumul_iter;
179  unsigned long iter=1*nb_champs*dim_solution;
180  for (unsigned long j=0;j<iter;j++)
181  {
182  double val=0;
183  fwrite(&val,sizeof(double),1,in);
184  }
185  i++;
186  cumul_iter=cumul_iter+iter;
187  }
188  LISTE_FEM_ELEMENT3::iterator ite3;
189  for (FEM_ELEMENT3* ele=femmai->get_premier_element3(ite3);ele;ele=femmai->get_suivant_element3(ite3))
190  {
191  tab[i]=cumul_iter;
192  unsigned long iter=1*nb_champs*dim_solution;
193  for (unsigned long j=0;j<iter;j++)
194  {
195  double val=0;
196  fwrite(&val,sizeof(double),1,in);
197  }
198  i++;
199  cumul_iter=cumul_iter+iter;
200  }
201 
202  }
204  {
205  LISTE_FEM_ELEMENT3::iterator ite;
207  {
208  tab[i]=cumul_iter;
209  unsigned long iter=ele->get_nb_fem_noeud()*nb_champs*dim_solution;
210  for (unsigned long j=0;j<iter;j++)
211  {
212  double val=0;
213  fwrite(&val,sizeof(double),1,in);
214  }
215  i++;
216  cumul_iter=cumul_iter+iter;
217  }
218 
219  }
221  {
222  LISTE_FEM_ELEMENT1::iterator ite;
224  {
225  tab[i]=cumul_iter;
226  unsigned long iter=ele->get_nb_fem_noeud()*nb_champs*dim_solution;
227  for (unsigned long j=0;j<iter;j++)
228  {
229  double val=0;
230  fwrite(&val,sizeof(double),1,in);
231  }
232  i++;
233  cumul_iter=cumul_iter+iter;
234  }
235 
236  }
238  {
239  LISTE_FEM_ELEMENT2::iterator ite;
241  {
242  tab[i]=cumul_iter;
243  unsigned long iter=ele->get_nb_fem_noeud()*nb_champs*dim_solution;
244  for (unsigned long j=0;j<iter;j++)
245  {
246  double val=0;
247  fwrite(&val,sizeof(double),1,in);
248  }
249  i++;
250  cumul_iter=cumul_iter+iter;
251  }
252 
253  }
255  {
256  LISTE_FEM_ELEMENT1::iterator ite;
258  {
259  tab[i]=cumul_iter;
260  unsigned long iter=ele->get_nb_fem_noeud()*nb_champs*dim_solution;
261  for (unsigned long j=0;j<iter;j++)
262  {
263  double val=0;
264  fwrite(&val,sizeof(double),1,in);
265  }
266  i++;
267  cumul_iter=cumul_iter+iter;
268  }LISTE_FEM_ELEMENT2::iterator ite2;
269  for (FEM_ELEMENT2* ele=femmai->get_premier_element2(ite2);ele;ele=femmai->get_suivant_element2(ite2))
270  {
271  tab[i]=cumul_iter;
272  unsigned long iter=ele->get_nb_fem_noeud()*nb_champs*dim_solution;
273  for (unsigned long j=0;j<iter;j++)
274  {
275  double val=0;
276  fwrite(&val,sizeof(double),1,in);
277  }
278  i++;
279  cumul_iter=cumul_iter+iter;
280  }LISTE_FEM_ELEMENT3::iterator ite3;
281  for (FEM_ELEMENT3* ele=femmai->get_premier_element3(ite3);ele;ele=femmai->get_suivant_element3(ite3))
282  {
283  tab[i]=cumul_iter;
284  unsigned long iter=ele->get_nb_fem_noeud()*nb_champs*dim_solution;
285  for (unsigned long j=0;j<iter;j++)
286  {
287  double val=0;
288  fwrite(&val,sizeof(double),1,in);
289  }
290  i++;
291  cumul_iter=cumul_iter+iter;
292  }
293 
294  }
296  {
297  LISTE_FEM_ELEMENT3::iterator ite;
299  {
300  tab[i]=cumul_iter;
301  unsigned long iter=1*nb_champs*dim_solution;
302  /*for (unsigned long j=0;j<iter;j++)
303  {
304  double val=0;
305  fwrite(&val,sizeof(double),1,in);
306  }*/
307  i++;
308  cumul_iter=cumul_iter+iter;
309  }
310 
311  }
313  {
314  LISTE_FEM_ELEMENT2::iterator ite;
316  {
317  tab[i]=cumul_iter;
318  unsigned long iter=1*nb_champs*dim_solution;
319  /*for (unsigned long j=0;j<iter;j++)
320  {
321  double val=0;
322  fwrite(&val,sizeof(double),1,in);
323  }*/
324  i++;
325  cumul_iter=cumul_iter+iter;
326  }
327 
328  }
330  {
331  LISTE_FEM_ELEMENT1::iterator ite;
333  {
334  tab[i]=cumul_iter;
335  unsigned long iter=1*nb_champs*dim_solution;
336  /*for (unsigned long j=0;j<iter;j++)
337  {
338  double val=0;
339  fwrite(&val,sizeof(double),1,in);
340  }*/
341  i++;
342  cumul_iter=cumul_iter+iter;
343  }
344 
345  }
346  tab[nbele]=cumul_iter;
347  fseek(in,sizeof(unsigned long),SEEK_SET);
348  for (unsigned long i=0;i<nbele+1;i++)
349  {
350  unsigned long val=0;
351  fwrite(&(tab[i]),sizeof(unsigned long),1,in);
352  }
353  delete [] tab;
354  fclose(in);
355  }
356  in=fopen(nom_fichier,"r+b");
357  hash.clear();
358  fseek(in,0,SEEK_SET);
359  unsigned long nb;
360  fread(&nb,sizeof(unsigned long),1,in);
361  hash.insert(hash.end(),nb);
362  for (unsigned long i=0;i<nb+1;i++)
363  {
364  unsigned long val;
365  fread(&val,sizeof(unsigned long),1,in);
366  hash.insert(hash.end(),val);
367  }
368 }
369 
370 
371 
373 {
374  delete [] nom_fichier;
375  delete [] legende;
376  if (change_gauss==true)
377  {
378  fseek(in,0,SEEK_SET);
379  for (unsigned long j=0;j<hash[0]+2;j++)
380  fwrite(&(hash[j]),sizeof(unsigned long),1,in);
381  }
382 
383  if (in!=NULL) fclose(in);
384 }
385 
387 {
388  fclose(in);
389  remove(nom_fichier);
390  in=NULL;
391 }
392 
394 {
395  return typeentite;
396 }
397 
398 double FEM_SOLUTION::lire(int i,int j,int coord,int num_no)
399 {
400  unsigned long nb=hash[0];
401  unsigned long pos=hash[i+1];
402  unsigned long pospro=hash[i+2];
403  int nbval=(pospro-pos)/nb_champs/dim_solution;
404  long posval=(nb+2)*sizeof(unsigned long)+(pos+j*dim_solution*nbval+num_no*dim_solution+coord)*sizeof(double);
405  fseek(in,posval,SEEK_SET);
406  double val;
407  fread(&val,sizeof(double),1,in);
408  return (val);
409 }
410 
411 void FEM_SOLUTION::ecrire(double val,int i,int j,int coord,int num_no)
412 {
413  unsigned long nb=hash[0];
414  unsigned long pos=hash[i+1];
415  unsigned long pospro=hash[i+2];
416  int nbval=(pospro-pos)/nb_champs/dim_solution;
417  long posval=(nb+2)*sizeof(unsigned long)+(pos+j*dim_solution*nbval+num_no*dim_solution+coord)*sizeof(double);
418  fseek(in,posval,SEEK_SET);
419  fwrite(&val,sizeof(double),1,in);
420  fflush(in);
421 }
422 
423 void FEM_SOLUTION::change_nb_gauss(int i,int num)
424 {
426  {
427  unsigned long nb=hash[0];
428  unsigned long pos=hash[i+1];
429  unsigned long oldpospro=hash[i+2];
430  unsigned long pospro=num*nb_champs*dim_solution+pos;
431  hash[i+2]=pospro;
432  //unsigned long decalage=pospro-oldpospro;
433  //for (unsigned long j=i+3;j<nb+1;j++)
434  //hash[j]=hash[j]+decalage;
435  change_gauss=true;
436  //fseek(in,0,SEEK_SET);
437  //for (unsigned long j=0;j<nb+2;j++)
438  //fwrite(&(hash[j]),sizeof(unsigned long),1,in);
439  }
440 
441 }
442 
444 {
446  {
447  unsigned long nb=hash[0];
448  unsigned long pos=hash[i+1];
449  unsigned long pospro=hash[i+2];
450  int nbval=(pospro-pos)/nb_champs/dim_solution;
451  return nbval;
452  }
453 return 0;
454 }
455 
456 
457 void FEM_SOLUTION::change_legende(int num,std::string val)
458 {
459  legende[num]=val;
460 }
461 
462 std::string FEM_SOLUTION::get_legende(int num)
463 {
464  return legende[num];
465 }
466 
468 {
469  return nb_champs;
470 }
471 
473 {
474  return femmai;
475 }
476 
478 {
479  return solmin[num];
480 }
481 
483 {
484  return solmax[num];
485 }
487 {
488  return dim_solution;
489 }
491 {
492  for (int j=0;j<9;j++)
493  {
494  solmax[j]=-1e308;
495  solmin[j]=1e308;
496  }
497  int i=0;
499  {
500  LISTE_FEM_NOEUD::iterator it;
501  for (FEM_NOEUD* no=femmai->get_premier_noeud(it);no!=NULL;no=femmai->get_suivant_noeud(it))
502  {
503  for (int k=0;k<dim_solution;k++)
504  {
505  double val=lire(i,num,k);
506  no->change_solution(val,k);
507  if (val<solmin[k]) solmin[k]=val;
508  if (val>solmax[k]) solmax[k]=val;
509  }
510  i++;
511  }
512  }
514  {
515  LISTE_FEM_ELEMENT1::iterator it;
516  for (FEM_ELEMENT1* seg=femmai->get_premier_element1(it);seg!=NULL;seg=femmai->get_suivant_element1(it))
517  {
518  for (int k=0;k<dim_solution;k++)
519  {
520  double val=lire(i,num,k);
521  seg->change_solution(val,k);
522  if (val<solmin[k]) solmin[k]=val;
523  if (val>solmax[k]) solmax[k]=val;
524  }
525  i++;
526  }
527  }
529  {
530  LISTE_FEM_ELEMENT2::iterator it;
531  for (FEM_ELEMENT2* tri=femmai->get_premier_element2(it);tri!=NULL;tri=femmai->get_suivant_element2(it))
532  {
533  for (int k=0;k<dim_solution;k++)
534  {
535  double val=lire(i,num,k);
536  tri->change_solution(val,k);
537  if (val<solmin[k]) solmin[k]=val;
538  if (val>solmax[k]) solmax[k]=val;
539  }
540  i++;
541  }
542  }
544  {
545  LISTE_FEM_ELEMENT3::iterator it;
546  for (FEM_ELEMENT3* tet=femmai->get_premier_element3(it);tet!=NULL;tet=femmai->get_suivant_element3(it))
547  {
548  for (int k=0;k<dim_solution;k++)
549  {
550  double val=lire(i,num,k);
551  tet->change_solution(val,k);
552  if (val<solmin[k]) solmin[k]=val;
553  if (val>solmax[k]) solmax[k]=val;
554  }
555  i++;
556  }
557  }
558  for (int k=0;k<dim_solution;k++)
559  if (OPERATEUR::egal(fabs(solmin[k]-solmax[k]),0.,1e-10)==1)
560  solmax[k]=solmin[k]+1e-10;
561 }
562 
563 
564 double FEM_SOLUTION::get_moyenne_volumique_champs(MG_VOLUME* mgvol,int numchamps,int coord)
565 {
567  {
568  LISTE_FEM_ELEMENT3::iterator it;
569  double unite=femmai->get_mg_geometrie()->get_valeur_unite();
570  int i=0;
571  double val=0.;
572  double vol=0.;
573  for (FEM_ELEMENT3* ele=femmai->get_premier_element3(it);ele!=NULL;ele=femmai->get_suivant_element3(it))
574  {
575  if (mgvol!=NULL)
576  if (ele->get_lien_topologie()!=mgvol) {i++;continue;}
577  int nbgauss=get_nb_gauss(i);
578  double valele=0.0;
579  for (int r=0;r<nbgauss;r++)
580  {
581  int degre=ele->get_degre_gauss(nbgauss);
582  double w;
583  double uvw[3];
584  ele->get_pt_gauss(degre,r,w,uvw);
585  double jac[9];
586  double det=ele->get_jacobien(jac,uvw,unite);
587  double valeur=lire(i,numchamps,coord,r)*fabs(det);
588  valele=valele+w*valeur;
589  vol=vol+w*fabs(det);
590  }
591  val=val+valele;
592  i++;
593  }
594  return val/vol;
595  }
596 return 0;
597 }
598 
599 double FEM_SOLUTION::get_moyenne_volumique_champs(BOITE_3D &boite_analyse, MG_VOLUME* mgvol, int numchamps, int coord)
600 {
602  {
603  LISTE_FEM_ELEMENT3::iterator it;
604  double unite=femmai->get_mg_geometrie()->get_valeur_unite();
605  int i=0;
606  double val=0.;
607  double vol=0.;
608  for (FEM_ELEMENT3* ele=femmai->get_premier_element3(it);ele!=NULL;ele=femmai->get_suivant_element3(it))
609  {
610  if (mgvol!=NULL)
611  if (ele->get_lien_topologie()!=mgvol) {i++;continue;}
612  double centre[3];
613  ele->get_boite_3D().get_centre(centre);
614  if(boite_analyse.contient(centre[0],centre[1],centre[2])==0) {i++;continue;}
615  int nbgauss=get_nb_gauss(i);
616  double valele=0.0;
617  for (int r=0;r<nbgauss;r++)
618  {
619  int degre=ele->get_degre_gauss(nbgauss);
620  double w;
621  double uvw[3];
622  ele->get_pt_gauss(degre,r,w,uvw);
623  double jac[9];
624  double det=ele->get_jacobien(jac,uvw,unite);
625  double valeur=lire(i,numchamps,coord,r)*fabs(det);
626  valele=valele+w*valeur;
627  vol=vol+w*fabs(det);
628  }
629  val=val+valele;
630  i++;
631  }
632  return val/vol;
633  }
634 return 0;
635 }
636 
637 
638 double FEM_SOLUTION::get_moyenne_surfacique_champs(MG_FACE* fac,int numchamps,int coord)
639 {
641  {
642  LISTE_FEM_ELEMENT2::iterator it;
643  double unite=femmai->get_mg_geometrie()->get_valeur_unite();
644  int i=0;
645  double val=0.;
646  double vol=0.;
647  for (FEM_ELEMENT2* ele=femmai->get_premier_element2(it);ele!=NULL;ele=femmai->get_suivant_element2(it))
648  {
649  if (fac!=NULL)
650  if (ele->get_lien_topologie()!=fac) {i++;continue;}
651  int nbgauss=get_nb_gauss(i);
652  double valele=0.0;
653  for (int r=0;r<nbgauss;r++)
654  {
655  int degre=ele->get_degre_gauss(nbgauss);
656  double w;
657  double uvw[3];
658  ele->get_pt_gauss(degre,r,w,uvw);
659  double jac[9];
660  double det=ele->get_jacobien(jac,uvw,unite);
661  double valeur=lire(i,numchamps,coord,r)*fabs(det);
662  valele=valele+w*valeur;
663  vol=vol+w*fabs(det);
664  }
665  val=val+valele;
666  i++;
667  }
668  return val/vol;
669  }
670 return 0;
671 }
672 
673 
674 double FEM_SOLUTION::get_moyenne_lineique_champs(MG_ARETE* are,int numchamps,int coord)
675 {
677  {
678  LISTE_FEM_ELEMENT1::iterator it;
679  double unite=femmai->get_mg_geometrie()->get_valeur_unite();
680  int i=0;
681  double val=0.;
682  double vol=0.;
683  for (FEM_ELEMENT1* ele=femmai->get_premier_element1(it);ele!=NULL;ele=femmai->get_suivant_element1(it))
684  {
685  int nbgauss=get_nb_gauss(i);
686  double valele=0.0;
687  for (int r=0;r<nbgauss;r++)
688  {
689  if (are!=NULL)
690  if (ele->get_lien_topologie()!=are) {i++;continue;}
691  int degre=ele->get_degre_gauss(nbgauss);
692  double w;
693  double uvw[3];
694  ele->get_pt_gauss(degre,r,w,uvw);
695  double jac[9];
696  int l,c;
697  double det=ele->get_jacobien(jac,uvw,unite);
698  double valeur=lire(i,numchamps,coord,r)*fabs(det);
699  valele=valele+w*valeur;
700  vol=vol+w*fabs(det);
701  }
702  val=val+valele;
703  i++;
704  }
705  return val/vol;
706  }
707 return 0;
708 }
709 double FEM_SOLUTION::get_moyenne_volumique_elementaire_champs(int numchamps,FEM_ELEMENT3* ele,int num,int coord)
710 {
712  {
713  double unite=femmai->get_mg_geometrie()->get_valeur_unite();
714  double val=0.;
715  double vol=0.;
716  int nbgauss=get_nb_gauss(num);
717  for (int r=0;r<nbgauss;r++)
718  {
719  int degre=ele->get_degre_gauss(nbgauss);
720  double w;
721  double uvw[3];
722  ele->get_pt_gauss(degre,r,w,uvw);
723  double jac[9];
724  double det=ele->get_jacobien(jac,uvw,unite);
725  double valeur=lire(num,numchamps,coord,r)*fabs(det);
726  val=val+w*valeur;
727  vol=vol+w*fabs(det);
728  }
729  return val/vol;
730  }
731 return 0;
732 }
733 
734 double FEM_SOLUTION::get_moyenne_volumique_elementaire_champs(int numchamps,FEM_ELEMENT3* ele,int num,double &volume,int coord)
735 {
737  {
738  double unite=femmai->get_mg_geometrie()->get_valeur_unite();
739  double val=0.;
740  volume=0;
741  int nbgauss=get_nb_gauss(num);
742  for (int r=0;r<nbgauss;r++)
743  {
744  int degre=ele->get_degre_gauss(nbgauss);
745  double w;
746  double uvw[3];
747  ele->get_pt_gauss(degre,r,w,uvw);
748  double jac[9];
749  double det=ele->get_jacobien(jac,uvw,unite);
750  double valeur=lire(num,numchamps,coord,r)*fabs(det);
751  val=val+w*valeur;
752  volume=volume+w*fabs(det);
753  }
754  return val/volume;
755  }
756 return 0;
757 }
758 
759 
760 double FEM_SOLUTION::get_moyenne_surfacique_elementaire_champs(int numchamps,FEM_ELEMENT2* ele,int num,int coord)
761 {
763  {
764  double unite=femmai->get_mg_geometrie()->get_valeur_unite();
765  double val=0.;
766  double vol=0.;
767  int nbgauss=get_nb_gauss(num);
768  for (int r=0;r<nbgauss;r++)
769  {
770  int degre=ele->get_degre_gauss(nbgauss);
771  double w;
772  double uvw[3];
773  ele->get_pt_gauss(degre,r,w,uvw);
774  double jac[9];
775  double det=ele->get_jacobien(jac,uvw,unite);
776  double valeur=lire(num,numchamps,coord,r)*fabs(det);
777  val=val+w*valeur;
778  vol=vol+w*fabs(det);
779  }
780  return val/vol;
781  }
782 return 0;
783 }
784 
785 double FEM_SOLUTION::get_moyenne_lineique_elementaire_champs(int numchamps,FEM_ELEMENT1* ele,int num,int coord)
786 {
788  {
789  double unite=femmai->get_mg_geometrie()->get_valeur_unite();
790  double val=0.;
791  double vol=0.;
792  int nbgauss=get_nb_gauss(num);
793  for (int r=0;r<nbgauss;r++)
794  {
795  int degre=ele->get_degre_gauss(nbgauss);
796  double w;
797  double uvw[3];
798  ele->get_pt_gauss(degre,r,w,uvw);
799  double jac[9];
800  int l,c;
801  double det=ele->get_jacobien(jac,uvw,unite);
802  double valeur=lire(num,numchamps,coord,r)*fabs(det);
803  val=val+w*valeur;
804  vol=vol+w*fabs(det);
805  }
806  return val/vol;
807  }
808 return 0;
809 }
810 
812 {
814  {
815  double unite=femmai->get_mg_geometrie()->get_valeur_unite();
816  double volume=0;
817  int nbgauss=get_nb_gauss(num);
818  for (int r=0;r<nbgauss;r++)
819  {
820  int degre=ele->get_degre_gauss(nbgauss);
821  double w;
822  double uvw[3];
823  ele->get_pt_gauss(degre,r,w,uvw);
824  double jac[9];
825  double det=ele->get_jacobien(jac,uvw,unite);
826  volume=volume+w*fabs(det);
827  }
828  return volume;
829  }
830 return 0;
831 }
832 
833 
834 std::string FEM_SOLUTION::get_nom(void)
835 {
836  return nomsolution;
837 }
838 
840 {
841  return nom_fichier;
842 }
843 void FEM_SOLUTION::enregistrer(std::ostream& o,double version)
844 {
845  o << "%" << get_id() << "=FEM_SOLUTION(" << typeentite << "," << dim_solution << "," << nomsolution << ",$" << femmai->get_id() << "," << nb_champs << "," << nom_fichier << ",(";
846  for (int i=0;i<nb_champs;i++)
847  {
848  o << legende[i];
849  if (i!=nb_champs-1) o<<",";
850  else o<<")";
851  }
852 
853 
854  o << ");" << std::endl;
855 }
856 
857 void FEM_SOLUTION::get_fichier_dependant(std::vector<std::string> &liste_fichier)
858 {
859 liste_fichier.push_back(nom_fichier);
860 }
861 
862 
863 std::ostream& operator << (std::ostream& o,FEM_SOLUTION& sol)
864 {
866  return o;
867 }
868 
869 
FEM_SOLUTION::get_nb_champ
int get_nb_champ(void)
Definition: fem_solution.cpp:467
FEM_SOLUTION
Definition: fem_solution.h:40
mg_geometrie.h
MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2
@ ENTITE_ELEMENT2
Definition: mg_definition.h:86
FEM_SOLUTION::get_legende_max
double get_legende_max(int num=0)
Definition: fem_solution.cpp:482
FEM_MAILLAGE::get_suivant_element3
FEM_ELEMENT3 * get_suivant_element3(LISTE_FEM_ELEMENT3::iterator &it)
Definition: fem_maillage.cpp:680
MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT1_NOEUD
@ ENTITE_ELEMENT1_NOEUD
Definition: mg_definition.h:86
FEM_SOLUTION::legende
std::string * legende
Definition: fem_solution.h:86
FEM_SOLUTION::get_legende
std::string get_legende(int num)
Definition: fem_solution.cpp:462
gestionversion.h
FEM_ELEMENT1::get_degre_gauss
virtual int get_degre_gauss(int num)=0
FEM_ELEMENT2::get_degre_gauss
virtual int get_degre_gauss(int num)=0
MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENTND
@ ENTITE_ELEMENTND
Definition: mg_definition.h:86
FEM_ELEMENT3::get_pt_gauss
virtual void get_pt_gauss(int degre, int num, double &w, double *uvw)=0
fem_solution.h
MG_IDENTIFICATEUR::get_id
unsigned long get_id()
Definition: mg_identificateur.cpp:53
FEM_SOLUTION::femmai
FEM_MAILLAGE * femmai
Definition: fem_solution.h:83
MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3_NOEUD
@ ENTITE_ELEMENT3_NOEUD
Definition: mg_definition.h:86
FEM_ELEMENT1::get_pt_gauss
virtual void get_pt_gauss(int degre, int num, double &w, double *u)=0
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
operator<<
std::ostream & operator<<(std::ostream &o, FEM_SOLUTION &sol)
Definition: fem_solution.cpp:863
FEM_SOLUTION::nomsolution
std::string nomsolution
Definition: fem_solution.h:87
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
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
FEM_MAILLAGE::get_mg_geometrie
MG_GEOMETRIE * get_mg_geometrie(void)
Definition: fem_maillage.cpp:88
FEM_ELEMENT2::get_pt_gauss
virtual void get_pt_gauss(int degre, int num, double &w, double *uv)=0
MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3_GAUSS
@ ENTITE_ELEMENT3_GAUSS
Definition: mg_definition.h:86
MG_VOLUME
Definition: mg_volume.h:33
FEM_SOLUTION::get_maillage
FEM_MAILLAGE * get_maillage(void)
Definition: fem_solution.cpp:472
FEM_ELEMENT2
Definition: fem_element2.h:34
FEM_MAILLAGE::get_nb_fem_noeud
unsigned int get_nb_fem_noeud(void)
Definition: fem_maillage.cpp:190
FEM_SOLUTION::solmin
double solmin[MAX_TYPE_SOLUTION]
Definition: fem_solution.h:84
FEM_MAILLAGE::get_premier_element2
FEM_ELEMENT2 * get_premier_element2(LISTE_FEM_ELEMENT2::iterator &it)
Definition: fem_maillage.cpp:561
FEM_SOLUTION::in
FILE * in
Definition: fem_solution.h:82
MAGIC_VERSION_FICHIER_DOUBLE
#define MAGIC_VERSION_FICHIER_DOUBLE
Definition: version.h:7
FEM_SOLUTION::nb_champs
int nb_champs
Definition: fem_solution.h:81
FEM_SOLUTION::change_gauss
bool change_gauss
Definition: fem_solution.h:91
FEM_SOLUTION::efface
void efface(void)
Definition: fem_solution.cpp:386
FEM_SOLUTION::FEM_SOLUTION
FEM_SOLUTION(class FEM_MAILLAGE *mai, int nb, char *chemin, int code, std::string nomsol, int entite=MAGIC::ENTITE_SOLUTION::ENTITE_NOEUD, int type_solution=MAGIC::TYPE_SOLUTION::SCALAIRE)
Definition: fem_solution.cpp:44
FEM_SOLUTION::solmax
double solmax[MAX_TYPE_SOLUTION]
Definition: fem_solution.h:85
FEM_MAILLAGE::get_suivant_element1
FEM_ELEMENT1 * get_suivant_element1(LISTE_FEM_ELEMENT1::iterator &it)
Definition: fem_maillage.cpp:457
FEM_SOLUTION::inisolution
void inisolution(char *chemin, int code)
Definition: fem_solution.cpp:55
FEM_SOLUTION::active_solution
void active_solution(int num)
Definition: fem_solution.cpp:490
FEM_MAILLAGE
Definition: fem_maillage.h:66
MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2_GAUSS
@ ENTITE_ELEMENT2_GAUSS
Definition: mg_definition.h:86
OPERATEUR::egal
static int egal(double a, double b, double eps)
Definition: ot_mathematique.cpp:1629
MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2_NOEUD
@ ENTITE_ELEMENT2_NOEUD
Definition: mg_definition.h:86
FEM_MAILLAGE::get_nb_fem_element2
unsigned int get_nb_fem_element2(void)
Definition: fem_maillage.cpp:494
FEM_ELEMENT1
Definition: fem_element1.h:34
FEM_SOLUTION::dim_solution
int dim_solution
Definition: fem_solution.h:90
MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT1_GAUSS
@ ENTITE_ELEMENT1_GAUSS
Definition: mg_definition.h:86
FEM_SOLUTION::get_moyenne_lineique_elementaire_champs
double get_moyenne_lineique_elementaire_champs(int numchamps, class FEM_ELEMENT1 *ele, int num, int coord)
Definition: fem_solution.cpp:785
FEM_SOLUTION::~FEM_SOLUTION
virtual ~FEM_SOLUTION()
Definition: fem_solution.cpp:372
FEM_SOLUTION::change_nb_gauss
void change_nb_gauss(int i, int num)
Definition: fem_solution.cpp:423
FEM_ELEMENT3::get_jacobien
virtual double get_jacobien(double *jac, double *uv, double unite=1.)
Definition: fem_element3.cpp:144
FEM_MAILLAGE::get_nb_fem_element3
unsigned int get_nb_fem_element3(void)
Definition: fem_maillage.cpp:605
FEM_SOLUTION::get_moyenne_lineique_champs
double get_moyenne_lineique_champs(class MG_ARETE *are, int numchamps, int coord)
Definition: fem_solution.cpp:674
FEM_SOLUTION::get_legende_min
double get_legende_min(int num=0)
Definition: fem_solution.cpp:477
FEM_MAILLAGE::get_suivant_element2
FEM_ELEMENT2 * get_suivant_element2(LISTE_FEM_ELEMENT2::iterator &it)
Definition: fem_maillage.cpp:569
FEM_SOLUTION::lire
double lire(int i, int j, int coord=0, int num_no=0)
Definition: fem_solution.cpp:398
FEM_SOLUTION::get_moyenne_surfacique_champs
double get_moyenne_surfacique_champs(class MG_FACE *face, int numchamps, int coord=0)
Definition: fem_solution.cpp:638
FEM_SOLUTION::get_moyenne_surfacique_elementaire_champs
double get_moyenne_surfacique_elementaire_champs(int numchamps, class FEM_ELEMENT2 *ele, int num, int coord)
Definition: fem_solution.cpp:760
FEM_SOLUTION::get_nom
std::string get_nom(void)
Definition: fem_solution.cpp:834
ot_mathematique.h
FEM_MAILLAGE::get_premier_element1
FEM_ELEMENT1 * get_premier_element1(LISTE_FEM_ELEMENT1::iterator &it)
Definition: fem_maillage.cpp:449
FEM_SOLUTION::nom_fichier
char * nom_fichier
Definition: fem_solution.h:80
FEM_NOEUD
Definition: fem_noeud.h:35
BOITE_3D
Definition: ot_boite_3d.h:27
FEM_SOLUTION::get_moyenne_volumique_champs
double get_moyenne_volumique_champs(class MG_VOLUME *vol, int numchamps, int coord=0)
Definition: fem_solution.cpp:564
ot_boite_3d.h
MG_GEOMETRIE::get_valeur_unite
double get_valeur_unite(void)
Definition: mg_geometrie.cpp:2652
FEM_ELEMENT1::get_jacobien
virtual double get_jacobien(double *jac, double *uv, double unite=1.)
Definition: fem_element1.cpp:81
FEM_SOLUTION::get_volume_element
double get_volume_element(class FEM_ELEMENT3 *ele, int num)
Definition: fem_solution.cpp:811
FEM_SOLUTION::get_nb_gauss
int get_nb_gauss(int i)
Definition: fem_solution.cpp:443
BOITE_3D::contient
int contient(double x, double y, double z)
Definition: ot_boite_3d.cpp:270
FEM_SOLUTION::hash
std::vector< unsigned long > hash
Definition: fem_solution.h:89
FEM_MAILLAGE::get_suivant_noeud
FEM_NOEUD * get_suivant_noeud(LISTE_FEM_NOEUD::iterator &it)
Definition: fem_maillage.cpp:182
FEM_SOLUTION::get_fichier_dependant
virtual void get_fichier_dependant(std::vector< std::string > &liste_fichier)
Definition: fem_solution.cpp:857
FEM_ELEMENT2::get_jacobien
virtual double get_jacobien(double *jac, double *uv, double unite=1.)
Definition: fem_element2.cpp:141
FEM_SOLUTION::typeentite
int typeentite
Definition: fem_solution.h:88
MG_ARETE
Definition: mg_arete.h:36
MG_FACE
Definition: mg_face.h:34
MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT1
@ ENTITE_ELEMENT1
Definition: mg_definition.h:86
MG_IDENTIFICATEUR
Definition: mg_identificateur.h:34
MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3
@ ENTITE_ELEMENT3
Definition: mg_definition.h:86
MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENTND_NOEUD
@ ENTITE_ELEMENTND_NOEUD
Definition: mg_definition.h:86
FEM_SOLUTION::enregistrer
virtual void enregistrer(std::ostream &o, double version)
Definition: fem_solution.cpp:843
FEM_SOLUTION::change_legende
void change_legende(int num, std::string val)
Definition: fem_solution.cpp:457
FEM_SOLUTION::get_entite_solution
int get_entite_solution(void)
Definition: fem_solution.cpp:393
FEM_SOLUTION::get_moyenne_volumique_elementaire_champs
double get_moyenne_volumique_elementaire_champs(int numchamps, class FEM_ELEMENT3 *ele, int num, int coord=0)
Definition: fem_solution.cpp:709
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
MAGIC::ENTITE_SOLUTION::ENTITE_NOEUD
@ ENTITE_NOEUD
Definition: mg_definition.h:86
FEM_ELEMENT3::get_degre_gauss
virtual int get_degre_gauss(int num)=0