ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/fem_solution.cpp
Revision: 762
Committed: Mon Nov 23 15:31:53 2015 UTC (9 years, 5 months ago) by francois
File size: 19212 byte(s)
Log Message:
calcul de moyenne volumique integrale dans fem_solution a partir des solutions aux points de gauss+ bug orthographe dans les conditions aux limites

File Contents

# User Rev Content
1 francois 283 //------------------------------------------------------------
2     //------------------------------------------------------------
3     // MAGiC
4     // Jean Christophe Cuilli�re et Vincent FRANCOIS
5     // D�partement de G�nie M�canique - UQTR
6     //------------------------------------------------------------
7     // Le projet MAGIC est un projet de recherche du d�partement
8     // de g�nie m�canique de l'Universit� du Qu�bec �
9     // Trois Rivi�res
10     // Les librairies ne peuvent �tre utilis�es sans l'accord
11     // des auteurs (contact : francois@uqtr.ca)
12     //------------------------------------------------------------
13     //------------------------------------------------------------
14     //
15     // fem_solution.cpp
16     //
17     //------------------------------------------------------------
18     //------------------------------------------------------------
19     // COPYRIGHT 2000
20     // Version du 02/03/2006 � 11H22
21     //------------------------------------------------------------
22     //------------------------------------------------------------
23    
24    
25     #include "gestionversion.h"
26     #include <math.h>
27     #include <iostream>
28     #include <stdlib.h>
29     #include <string.h>
30    
31     #include "fem_solution.h"
32     #include "fem_maillage.h"
33 francois 762 #include "mg_geometrie.h"
34 francois 283 #include "ot_mathematique.h"
35    
36    
37     #include <stdio.h> // pour la fonction remove() qui remplace DeleteFile
38    
39    
40    
41    
42    
43    
44 francois 375 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)
45 francois 283 {
46 francois 375 inisolution(chemin,code);
47 francois 283 }
48    
49 francois 375 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)
50 francois 283 {
51 francois 375 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 francois 283 {
68     in=fopen(nom_fichier,"wb");
69 francois 375 unsigned long nbele=0;
70     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_NOEUD) nbele=femmai->get_nb_fem_noeud();
71     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT1) nbele=femmai->get_nb_fem_element1();
72     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2) nbele=femmai->get_nb_fem_element2();
73     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3) nbele=femmai->get_nb_fem_element3();
74     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT1_NOEUD) nbele=femmai->get_nb_fem_element1();
75     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2_NOEUD) nbele=femmai->get_nb_fem_element2();
76     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3_NOEUD) nbele=femmai->get_nb_fem_element3();
77 francois 757 if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT1_GAUSS) nbele=femmai->get_nb_fem_element1();
78     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2_GAUSS) nbele=femmai->get_nb_fem_element2();
79     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3_GAUSS) nbele=femmai->get_nb_fem_element3();
80 francois 375 fwrite(&nbele,sizeof(unsigned long),1,in);
81     for (unsigned long i=0;i<nbele+1;i++)
82     {
83     unsigned long val=0;
84     fwrite(&val,sizeof(unsigned long),1,in);
85     }
86     unsigned long *tab=new unsigned long[nbele+1];
87     unsigned long i=0;
88     unsigned long cumul_iter=0;
89     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_NOEUD)
90     {
91     LISTE_FEM_NOEUD::iterator ite;
92     for (FEM_NOEUD* ele=femmai->get_premier_noeud(ite);ele;ele=femmai->get_suivant_noeud(ite))
93     {
94     tab[i]=cumul_iter;
95     unsigned long iter=1*nb_champs*dim_solution;
96     for (unsigned long j=0;j<iter;j++)
97     {
98     double val=0;
99     fwrite(&val,sizeof(double),1,in);
100     }
101     i++;
102     cumul_iter=cumul_iter+iter;
103     }
104    
105     }
106     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT1)
107     {
108     LISTE_FEM_ELEMENT1::iterator ite;
109     for (FEM_ELEMENT1* ele=femmai->get_premier_element1(ite);ele;ele=femmai->get_suivant_element1(ite))
110     {
111     tab[i]=cumul_iter;
112     unsigned long iter=1*nb_champs*dim_solution;
113     for (unsigned long j=0;j<iter;j++)
114     {
115     double val=0;
116     fwrite(&val,sizeof(double),1,in);
117     }
118     i++;
119     cumul_iter=cumul_iter+iter;
120     }
121    
122     }
123     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2)
124     {
125     LISTE_FEM_ELEMENT2::iterator ite;
126     for (FEM_ELEMENT2* ele=femmai->get_premier_element2(ite);ele;ele=femmai->get_suivant_element2(ite))
127     {
128     tab[i]=cumul_iter;
129     unsigned long iter=1*nb_champs*dim_solution;
130     for (unsigned long j=0;j<iter;j++)
131     {
132     double val=0;
133     fwrite(&val,sizeof(double),1,in);
134     }
135     i++;
136     cumul_iter=cumul_iter+iter;
137     }
138    
139     }
140     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3)
141     {
142     LISTE_FEM_ELEMENT3::iterator ite;
143     for (FEM_ELEMENT3* ele=femmai->get_premier_element3(ite);ele;ele=femmai->get_suivant_element3(ite))
144     {
145     tab[i]=cumul_iter;
146     unsigned long iter=1*nb_champs*dim_solution;
147     for (unsigned long j=0;j<iter;j++)
148     {
149     double val=0;
150     fwrite(&val,sizeof(double),1,in);
151     }
152     i++;
153     cumul_iter=cumul_iter+iter;
154     }
155    
156     }
157     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3_NOEUD)
158     {
159     LISTE_FEM_ELEMENT3::iterator ite;
160     for (FEM_ELEMENT3* ele=femmai->get_premier_element3(ite);ele;ele=femmai->get_suivant_element3(ite))
161     {
162     tab[i]=cumul_iter;
163     unsigned long iter=ele->get_nb_fem_noeud()*nb_champs*dim_solution;
164     for (unsigned long j=0;j<iter;j++)
165     {
166     double val=0;
167     fwrite(&val,sizeof(double),1,in);
168     }
169     i++;
170     cumul_iter=cumul_iter+iter;
171     }
172    
173     }
174     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT1_NOEUD)
175     {
176     LISTE_FEM_ELEMENT1::iterator ite;
177     for (FEM_ELEMENT1* ele=femmai->get_premier_element1(ite);ele;ele=femmai->get_suivant_element1(ite))
178     {
179     tab[i]=cumul_iter;
180     unsigned long iter=ele->get_nb_fem_noeud()*nb_champs*dim_solution;
181     for (unsigned long j=0;j<iter;j++)
182     {
183     double val=0;
184     fwrite(&val,sizeof(double),1,in);
185     }
186     i++;
187     cumul_iter=cumul_iter+iter;
188     }
189    
190     }
191     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2_NOEUD)
192     {
193     LISTE_FEM_ELEMENT2::iterator ite;
194     for (FEM_ELEMENT2* ele=femmai->get_premier_element2(ite);ele;ele=femmai->get_suivant_element2(ite))
195     {
196     tab[i]=cumul_iter;
197     unsigned long iter=ele->get_nb_fem_noeud()*nb_champs*dim_solution;
198     for (unsigned long j=0;j<iter;j++)
199     {
200     double val=0;
201     fwrite(&val,sizeof(double),1,in);
202     }
203     i++;
204     cumul_iter=cumul_iter+iter;
205     }
206    
207     }
208 francois 757 if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3_GAUSS)
209     {
210     LISTE_FEM_ELEMENT3::iterator ite;
211     for (FEM_ELEMENT3* ele=femmai->get_premier_element3(ite);ele;ele=femmai->get_suivant_element3(ite))
212     {
213     tab[i]=cumul_iter;
214     unsigned long iter=1*nb_champs*dim_solution;
215     /*for (unsigned long j=0;j<iter;j++)
216     {
217     double val=0;
218     fwrite(&val,sizeof(double),1,in);
219     }*/
220     i++;
221     cumul_iter=cumul_iter+iter;
222     }
223    
224     }
225     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2_GAUSS)
226     {
227     LISTE_FEM_ELEMENT2::iterator ite;
228     for (FEM_ELEMENT2* ele=femmai->get_premier_element2(ite);ele;ele=femmai->get_suivant_element2(ite))
229     {
230     tab[i]=cumul_iter;
231     unsigned long iter=1*nb_champs*dim_solution;
232     /*for (unsigned long j=0;j<iter;j++)
233     {
234     double val=0;
235     fwrite(&val,sizeof(double),1,in);
236     }*/
237     i++;
238     cumul_iter=cumul_iter+iter;
239     }
240    
241     }
242     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT1_GAUSS)
243     {
244     LISTE_FEM_ELEMENT1::iterator ite;
245     for (FEM_ELEMENT1* ele=femmai->get_premier_element1(ite);ele;ele=femmai->get_suivant_element1(ite))
246     {
247     tab[i]=cumul_iter;
248     unsigned long iter=1*nb_champs*dim_solution;
249     /*for (unsigned long j=0;j<iter;j++)
250     {
251     double val=0;
252     fwrite(&val,sizeof(double),1,in);
253     }*/
254     i++;
255     cumul_iter=cumul_iter+iter;
256     }
257    
258     }
259 francois 375 tab[nbele]=cumul_iter;
260     fseek(in,sizeof(unsigned long),SEEK_SET);
261     for (unsigned long i=0;i<nbele+1;i++)
262     {
263     unsigned long val=0;
264     fwrite(&(tab[i]),sizeof(unsigned long),1,in);
265     }
266     delete [] tab;
267 francois 283 fclose(in);
268     }
269     in=fopen(nom_fichier,"r+b");
270 francois 375 hash.clear();
271     fseek(in,0,SEEK_SET);
272     unsigned long nb;
273     fread(&nb,sizeof(unsigned long),1,in);
274     hash.insert(hash.end(),nb);
275     for (unsigned long i=0;i<nb+1;i++)
276     {
277     unsigned long val;
278     fread(&val,sizeof(unsigned long),1,in);
279     hash.insert(hash.end(),val);
280     }
281 francois 283 }
282    
283 francois 375
284    
285 francois 283 FEM_SOLUTION::~FEM_SOLUTION()
286     {
287     delete [] nom_fichier;
288     delete [] legende;
289     if (in!=NULL) fclose(in);
290     }
291    
292     void FEM_SOLUTION::efface(void)
293     {
294     fclose(in);
295     remove(nom_fichier);
296     // DeleteFile(nom_fichier);
297     in=NULL;
298     }
299    
300 francois 635 int FEM_SOLUTION::get_entite_solution(void)
301 francois 283 {
302     return typeentite;
303     }
304    
305 francois 375 double FEM_SOLUTION::lire(int i,int j,int coord,int num_no)
306 francois 283 {
307 francois 375 unsigned long nb=hash[0];
308     unsigned long pos=hash[i+1];
309     unsigned long pospro=hash[i+2];
310     int nbval=(pospro-pos)/nb_champs/dim_solution;
311     long posval=(nb+2)*sizeof(unsigned long)+(pos+j*dim_solution*nbval+num_no*dim_solution+coord)*sizeof(double);
312     fseek(in,posval,SEEK_SET);
313 francois 283 double val;
314 francois 375 fread(&val,sizeof(double),1,in);
315 francois 283 return (val);
316     }
317    
318 francois 375 void FEM_SOLUTION::ecrire(double val,int i,int j,int coord,int num_no)
319 francois 283 {
320 francois 375 unsigned long nb=hash[0];
321     unsigned long pos=hash[i+1];
322     unsigned long pospro=hash[i+2];
323     int nbval=(pospro-pos)/nb_champs/dim_solution;
324     long posval=(nb+2)*sizeof(unsigned long)+(pos+j*dim_solution*nbval+num_no*dim_solution+coord)*sizeof(double);
325     fseek(in,posval,SEEK_SET);
326 francois 283 fwrite(&val,sizeof(double),1,in);
327     fflush(in);
328     }
329    
330 francois 757 void FEM_SOLUTION::change_nb_gauss(int i,int num)
331     {
332     if ((typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT1_GAUSS)||(typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2_GAUSS)||(typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3_GAUSS))
333     {
334     unsigned long nb=hash[0];
335     unsigned long pos=hash[i+1];
336     unsigned long oldpospro=hash[i+2];
337     unsigned long pospro=num*nb_champs*dim_solution+pos;
338     hash[i+2]=pospro;
339     unsigned long decalage=pospro-oldpospro;
340     for (unsigned long j=i+3;j<nb+1;j++)
341     hash[j]=hash[j]+decalage;
342     fseek(in,0,SEEK_SET);
343     for (unsigned long j=0;j<nb+2;j++)
344     fwrite(&(hash[j]),sizeof(unsigned long),1,in);
345     }
346    
347     }
348 francois 283
349 francois 757 int FEM_SOLUTION::get_nb_gauss(int i)
350     {
351     if ((typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT1_GAUSS)||(typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2_GAUSS)||(typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3_GAUSS))
352     {
353     unsigned long nb=hash[0];
354     unsigned long pos=hash[i+1];
355     unsigned long pospro=hash[i+2];
356     int nbval=(pospro-pos)/nb_champs/dim_solution;
357     return nbval;
358     }
359     return 0;
360     }
361    
362    
363 francois 283 void FEM_SOLUTION::change_legende(int num,std::string val)
364     {
365     legende[num]=val;
366     }
367    
368     std::string FEM_SOLUTION::get_legende(int num)
369     {
370     return legende[num];
371     }
372    
373     int FEM_SOLUTION::get_nb_champ(void)
374     {
375     return nb_champs;
376     }
377    
378     FEM_MAILLAGE* FEM_SOLUTION::get_maillage(void)
379     {
380     return femmai;
381     }
382    
383 francois 375 double FEM_SOLUTION::get_legende_min(int num)
384 francois 283 {
385 francois 375 return solmin[num];
386 francois 283 }
387    
388 francois 375 double FEM_SOLUTION::get_legende_max(int num)
389 francois 283 {
390 francois 375 return solmax[num];
391 francois 283 }
392 francois 375 int FEM_SOLUTION::get_dim_solution(void)
393     {
394     return dim_solution;
395     }
396 francois 283 void FEM_SOLUTION::active_solution(int num)
397     {
398 francois 375 for (int j=0;j<9;j++)
399     {
400     solmax[j]=-1e308;
401     solmin[j]=1e308;
402     }
403 francois 283 int i=0;
404 francois 375 if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_NOEUD)
405 francois 283 {
406     LISTE_FEM_NOEUD::iterator it;
407     for (FEM_NOEUD* no=femmai->get_premier_noeud(it);no!=NULL;no=femmai->get_suivant_noeud(it))
408     {
409 francois 375 for (int k=0;k<dim_solution;k++)
410     {
411     double val=lire(i,num,k);
412     no->change_solution(val,k);
413     if (val<solmin[k]) solmin[k]=val;
414     if (val>solmax[k]) solmax[k]=val;
415     }
416 francois 283 i++;
417     }
418     }
419 francois 375 if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT1)
420 francois 283 {
421 francois 309 LISTE_FEM_ELEMENT1::iterator it;
422     for (FEM_ELEMENT1* seg=femmai->get_premier_element1(it);seg!=NULL;seg=femmai->get_suivant_element1(it))
423 francois 283 {
424 francois 375 for (int k=0;k<dim_solution;k++)
425     {
426     double val=lire(i,num,k);
427     seg->change_solution(val,k);
428     if (val<solmin[k]) solmin[k]=val;
429     if (val>solmax[k]) solmax[k]=val;
430     }
431 francois 283 i++;
432     }
433     }
434 francois 375 if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2)
435 francois 283 {
436 francois 309 LISTE_FEM_ELEMENT2::iterator it;
437     for (FEM_ELEMENT2* tri=femmai->get_premier_element2(it);tri!=NULL;tri=femmai->get_suivant_element2(it))
438 francois 283 {
439 francois 375 for (int k=0;k<dim_solution;k++)
440     {
441     double val=lire(i,num);
442     tri->change_solution(val);
443     if (val<solmin[k]) solmin[k]=val;
444     if (val>solmax[k]) solmax[k]=val;
445     }
446 francois 283 i++;
447     }
448     }
449 francois 375 if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3)
450 francois 283 {
451 francois 309 LISTE_FEM_ELEMENT3::iterator it;
452     for (FEM_ELEMENT3* tet=femmai->get_premier_element3(it);tet!=NULL;tet=femmai->get_suivant_element3(it))
453 francois 283 {
454 francois 375 for (int k=0;k<dim_solution;k++)
455     {
456     double val=lire(i,num);
457     tet->change_solution(val);
458     if (val<solmin[k]) solmin[k]=val;
459     if (val>solmax[k]) solmax[k]=val;
460     }
461 francois 283 i++;
462     }
463     }
464 francois 375 for (int k=0;k<dim_solution;k++)
465     if (OPERATEUR::egal(fabs(solmin[k]-solmax[k]),0.,1e-10)==1)
466     solmax[k]=solmin[k]+1e-10;
467 francois 283 }
468    
469 francois 762
470     double FEM_SOLUTION::get_moyenne_volumique_champs(MG_VOLUME* mgvol,int numchamps,int coord)
471     {
472     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3_GAUSS)
473     {
474     LISTE_FEM_ELEMENT3::iterator it;
475     double unite=femmai->get_mg_geometrie()->get_valeur_unite();
476     int i=0;
477     double val=0.;
478     double vol=0.;
479     for (FEM_ELEMENT3* ele=femmai->get_premier_element3(it);ele!=NULL;ele=femmai->get_suivant_element3(it))
480     {
481     if (mgvol!=NULL)
482     if (ele->get_lien_topologie()!=mgvol) {i++;continue;}
483     int nbgauss=get_nb_gauss(i);
484     double valele=0.0;
485     for (int r=0;r<nbgauss;r++)
486     {
487     int degre=ele->get_degre_gauss(nbgauss);
488     double w;
489     double uvw[3];
490     ele->get_pt_gauss(degre,r,w,uvw);
491     double jac[9];
492     int l,c;
493     double det=ele->get_jacobien(jac,uvw,l,c,unite);
494     double valeur=lire(i,numchamps,coord,r)*fabs(det);
495     valele=valele+w*valeur;
496     vol=vol+w*fabs(det);
497     }
498     val=val+valele;
499     i++;
500     }
501     return val/vol;
502     }
503     return 0;
504     }
505    
506    
507     double FEM_SOLUTION::get_moyenne_surfacique_champs(MG_FACE* fac,int numchamps,int coord)
508     {
509     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2_GAUSS)
510     {
511     LISTE_FEM_ELEMENT2::iterator it;
512     double unite=femmai->get_mg_geometrie()->get_valeur_unite();
513     int i=0;
514     double val=0.;
515     double vol=0.;
516     for (FEM_ELEMENT2* ele=femmai->get_premier_element2(it);ele!=NULL;ele=femmai->get_suivant_element2(it))
517     {
518     if (fac!=NULL)
519     if (ele->get_lien_topologie()!=fac) {i++;continue;}
520     int nbgauss=get_nb_gauss(i);
521     double valele=0.0;
522     for (int r=0;r<nbgauss;r++)
523     {
524     int degre=ele->get_degre_gauss(nbgauss);
525     double w;
526     double uvw[3];
527     ele->get_pt_gauss(degre,r,w,uvw);
528     double jac[9];
529     int l,c;
530     double det=ele->get_jacobien(jac,uvw,l,c,unite);
531     double valeur=lire(i,numchamps,coord,r)*fabs(det);
532     valele=valele+w*valeur;
533     vol=vol+w*fabs(det);
534     }
535     val=val+valele;
536     i++;
537     }
538     return val/vol;
539     }
540     return 0;
541     }
542    
543    
544     double FEM_SOLUTION::get_moyenne_lineique_champs(MG_ARETE* are,int numchamps,int coord)
545     {
546     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT1_GAUSS)
547     {
548     LISTE_FEM_ELEMENT1::iterator it;
549     double unite=femmai->get_mg_geometrie()->get_valeur_unite();
550     int i=0;
551     double val=0.;
552     double vol=0.;
553     for (FEM_ELEMENT1* ele=femmai->get_premier_element1(it);ele!=NULL;ele=femmai->get_suivant_element1(it))
554     {
555     int nbgauss=get_nb_gauss(i);
556     double valele=0.0;
557     for (int r=0;r<nbgauss;r++)
558     {
559     if (are!=NULL)
560     if (ele->get_lien_topologie()!=are) {i++;continue;}
561     int degre=ele->get_degre_gauss(nbgauss);
562     double w;
563     double uvw[3];
564     ele->get_pt_gauss(degre,r,w,uvw);
565     double jac[9];
566     int l,c;
567     double det=ele->get_jacobien(jac,uvw,l,c,unite);
568     double valeur=lire(i,numchamps,coord,r)*fabs(det);
569     valele=valele+w*valeur;
570     vol=vol+w*fabs(det);
571     }
572     val=val+valele;
573     i++;
574     }
575     return val/vol;
576     }
577     return 0;
578     }
579     double FEM_SOLUTION::get_moyenne_volumique_elementaire_champs(int numchamps,FEM_ELEMENT3* ele,int num,int coord)
580     {
581     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3_GAUSS)
582     {
583     double unite=femmai->get_mg_geometrie()->get_valeur_unite();
584     double val=0.;
585     double vol=0.;
586     int nbgauss=get_nb_gauss(num);
587     for (int r=0;r<nbgauss;r++)
588     {
589     int degre=ele->get_degre_gauss(nbgauss);
590     double w;
591     double uvw[3];
592     ele->get_pt_gauss(degre,r,w,uvw);
593     double jac[9];
594     int l,c;
595     double det=ele->get_jacobien(jac,uvw,l,c,unite);
596     double valeur=lire(num,numchamps,coord,r)*fabs(det);
597     val=val+w*valeur;
598     vol=vol+w*fabs(det);
599     }
600     return val/vol;
601     }
602     return 0;
603     }
604    
605     double FEM_SOLUTION::get_moyenne_surfacique_elementaire_champs(int numchamps,FEM_ELEMENT2* ele,int num,int coord)
606     {
607     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2_GAUSS)
608     {
609     double unite=femmai->get_mg_geometrie()->get_valeur_unite();
610     double val=0.;
611     double vol=0.;
612     int nbgauss=get_nb_gauss(num);
613     for (int r=0;r<nbgauss;r++)
614     {
615     int degre=ele->get_degre_gauss(nbgauss);
616     double w;
617     double uvw[3];
618     ele->get_pt_gauss(degre,r,w,uvw);
619     double jac[9];
620     int l,c;
621     double det=ele->get_jacobien(jac,uvw,l,c,unite);
622     double valeur=lire(num,numchamps,coord,r)*fabs(det);
623     val=val+w*valeur;
624     vol=vol+w*fabs(det);
625     }
626     return val/vol;
627     }
628     return 0;
629     }
630    
631     double FEM_SOLUTION::get_moyenne_lineique_elementaire_champs(int numchamps,FEM_ELEMENT1* ele,int num,int coord)
632     {
633     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT1_GAUSS)
634     {
635     double unite=femmai->get_mg_geometrie()->get_valeur_unite();
636     double val=0.;
637     double vol=0.;
638     int nbgauss=get_nb_gauss(num);
639     for (int r=0;r<nbgauss;r++)
640     {
641     int degre=ele->get_degre_gauss(nbgauss);
642     double w;
643     double uvw[3];
644     ele->get_pt_gauss(degre,r,w,uvw);
645     double jac[9];
646     int l,c;
647     double det=ele->get_jacobien(jac,uvw,l,c,unite);
648     double valeur=lire(num,numchamps,coord,r)*fabs(det);
649     val=val+w*valeur;
650     vol=vol+w*fabs(det);
651     }
652     return val/vol;
653     }
654     return 0;
655     }
656    
657    
658    
659 francois 283 std::string FEM_SOLUTION::get_nom(void)
660     {
661     return nomsolution;
662     }
663    
664 francois 326 std::string FEM_SOLUTION::get_nom_fichier(void)
665     {
666     return nom_fichier;
667     }
668 francois 283 void FEM_SOLUTION::enregistrer(std::ostream& o)
669     {
670 francois 375 o << "%" << get_id() << "=FEM_SOLUTION(" << typeentite << "," << dim_solution << "," << nomsolution << ",$" << femmai->get_id() << "," << nb_champs << "," << nom_fichier << ",(";
671 francois 283 for (int i=0;i<nb_champs;i++)
672     {
673     o << legende[i];
674     if (i!=nb_champs-1) o<<",";
675     else o<<")";
676     }
677    
678    
679     o << ");" << std::endl;
680     }
681    
682    
683    
684    
685     std::ostream& operator << (std::ostream& o,FEM_SOLUTION& sol)
686     {
687     sol.enregistrer(o);
688     return o;
689     }
690    
691