ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/fem_solution.cpp
Revision: 763
Committed: Wed Dec 2 19:55:53 2015 UTC (9 years, 5 months ago) by francois
File size: 19242 byte(s)
Log Message:
Le fichier MAGiC est maintenant versionné. LA version actuelle est 2.0. L'ancienne version est 1.0.
Tout est transparent pour l'utilisateur. Les vieilles versions sont lisibles mais les nouveaux enregistrements sont dans la version la plus récente.
Changement des conditions aux limites : ajout d'un parametre pour dire si la condition numerique est une valeur ou une formule ou un lien vers une autre entité magic.
Les parametres pour saisir sont maintenant -ccf -ccfi -ccff -ccft -ccfit -ccfft

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 763 void FEM_SOLUTION::enregistrer(std::ostream& o,double version)
669 francois 283 {
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 francois 763 sol.enregistrer(o,VERSIONFICHIER);
688 francois 283 return o;
689     }
690    
691