ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/fem_solution.cpp
Revision: 767
Committed: Wed Dec 23 20:52:36 2015 UTC (9 years, 4 months ago) by francois
File size: 22051 byte(s)
Log Message:
calcul sur des structures mixtes volume poutre.
cela fonctionne pour l'instant pour des blocages appliquées uniquement aux mailles 3D et pour des résultats aux mailles 3D uniquement aux noeuds

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 767 if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENTND) nbele=femmai->get_nb_fem_element3()+femmai->get_nb_fem_element2()+femmai->get_nb_fem_element1();
81     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENTND_NOEUD) nbele=femmai->get_nb_fem_element3()+femmai->get_nb_fem_element2()+femmai->get_nb_fem_element1();
82 francois 375 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;
91     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_NOEUD)
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     }
108     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT1)
109     {
110     LISTE_FEM_ELEMENT1::iterator ite;
111     for (FEM_ELEMENT1* ele=femmai->get_premier_element1(ite);ele;ele=femmai->get_suivant_element1(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     }
125     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2)
126     {
127     LISTE_FEM_ELEMENT2::iterator ite;
128     for (FEM_ELEMENT2* ele=femmai->get_premier_element2(ite);ele;ele=femmai->get_suivant_element2(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     }
142     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3)
143     {
144     LISTE_FEM_ELEMENT3::iterator ite;
145     for (FEM_ELEMENT3* ele=femmai->get_premier_element3(ite);ele;ele=femmai->get_suivant_element3(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     }
159 francois 767 if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENTND)
160     {
161     LISTE_FEM_ELEMENT1::iterator ite;
162     for (FEM_ELEMENT1* ele=femmai->get_premier_element1(ite);ele;ele=femmai->get_suivant_element1(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     }
203 francois 375 if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3_NOEUD)
204     {
205     LISTE_FEM_ELEMENT3::iterator ite;
206     for (FEM_ELEMENT3* ele=femmai->get_premier_element3(ite);ele;ele=femmai->get_suivant_element3(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     }
220     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT1_NOEUD)
221     {
222     LISTE_FEM_ELEMENT1::iterator ite;
223     for (FEM_ELEMENT1* ele=femmai->get_premier_element1(ite);ele;ele=femmai->get_suivant_element1(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     }
237     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2_NOEUD)
238     {
239     LISTE_FEM_ELEMENT2::iterator ite;
240     for (FEM_ELEMENT2* ele=femmai->get_premier_element2(ite);ele;ele=femmai->get_suivant_element2(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     }
254 francois 767 if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENTND_NOEUD)
255 francois 757 {
256 francois 767 LISTE_FEM_ELEMENT1::iterator ite;
257     for (FEM_ELEMENT1* ele=femmai->get_premier_element1(ite);ele;ele=femmai->get_suivant_element1(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     }
295     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3_GAUSS)
296     {
297 francois 757 LISTE_FEM_ELEMENT3::iterator ite;
298     for (FEM_ELEMENT3* ele=femmai->get_premier_element3(ite);ele;ele=femmai->get_suivant_element3(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     }
312     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2_GAUSS)
313     {
314     LISTE_FEM_ELEMENT2::iterator ite;
315     for (FEM_ELEMENT2* ele=femmai->get_premier_element2(ite);ele;ele=femmai->get_suivant_element2(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     }
329     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT1_GAUSS)
330     {
331     LISTE_FEM_ELEMENT1::iterator ite;
332     for (FEM_ELEMENT1* ele=femmai->get_premier_element1(ite);ele;ele=femmai->get_suivant_element1(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 francois 375 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 francois 283 fclose(in);
355     }
356     in=fopen(nom_fichier,"r+b");
357 francois 375 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 francois 283 }
369    
370 francois 375
371    
372 francois 283 FEM_SOLUTION::~FEM_SOLUTION()
373     {
374     delete [] nom_fichier;
375     delete [] legende;
376     if (in!=NULL) fclose(in);
377     }
378    
379     void FEM_SOLUTION::efface(void)
380     {
381     fclose(in);
382     remove(nom_fichier);
383     // DeleteFile(nom_fichier);
384     in=NULL;
385     }
386    
387 francois 635 int FEM_SOLUTION::get_entite_solution(void)
388 francois 283 {
389     return typeentite;
390     }
391    
392 francois 375 double FEM_SOLUTION::lire(int i,int j,int coord,int num_no)
393 francois 283 {
394 francois 375 unsigned long nb=hash[0];
395     unsigned long pos=hash[i+1];
396     unsigned long pospro=hash[i+2];
397     int nbval=(pospro-pos)/nb_champs/dim_solution;
398     long posval=(nb+2)*sizeof(unsigned long)+(pos+j*dim_solution*nbval+num_no*dim_solution+coord)*sizeof(double);
399     fseek(in,posval,SEEK_SET);
400 francois 283 double val;
401 francois 375 fread(&val,sizeof(double),1,in);
402 francois 283 return (val);
403     }
404    
405 francois 375 void FEM_SOLUTION::ecrire(double val,int i,int j,int coord,int num_no)
406 francois 283 {
407 francois 375 unsigned long nb=hash[0];
408     unsigned long pos=hash[i+1];
409     unsigned long pospro=hash[i+2];
410     int nbval=(pospro-pos)/nb_champs/dim_solution;
411     long posval=(nb+2)*sizeof(unsigned long)+(pos+j*dim_solution*nbval+num_no*dim_solution+coord)*sizeof(double);
412     fseek(in,posval,SEEK_SET);
413 francois 283 fwrite(&val,sizeof(double),1,in);
414     fflush(in);
415     }
416    
417 francois 757 void FEM_SOLUTION::change_nb_gauss(int i,int num)
418     {
419     if ((typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT1_GAUSS)||(typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2_GAUSS)||(typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3_GAUSS))
420     {
421     unsigned long nb=hash[0];
422     unsigned long pos=hash[i+1];
423     unsigned long oldpospro=hash[i+2];
424     unsigned long pospro=num*nb_champs*dim_solution+pos;
425     hash[i+2]=pospro;
426     unsigned long decalage=pospro-oldpospro;
427     for (unsigned long j=i+3;j<nb+1;j++)
428     hash[j]=hash[j]+decalage;
429     fseek(in,0,SEEK_SET);
430     for (unsigned long j=0;j<nb+2;j++)
431     fwrite(&(hash[j]),sizeof(unsigned long),1,in);
432     }
433    
434     }
435 francois 283
436 francois 757 int FEM_SOLUTION::get_nb_gauss(int i)
437     {
438     if ((typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT1_GAUSS)||(typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2_GAUSS)||(typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3_GAUSS))
439     {
440     unsigned long nb=hash[0];
441     unsigned long pos=hash[i+1];
442     unsigned long pospro=hash[i+2];
443     int nbval=(pospro-pos)/nb_champs/dim_solution;
444     return nbval;
445     }
446     return 0;
447     }
448    
449    
450 francois 283 void FEM_SOLUTION::change_legende(int num,std::string val)
451     {
452     legende[num]=val;
453     }
454    
455     std::string FEM_SOLUTION::get_legende(int num)
456     {
457     return legende[num];
458     }
459    
460     int FEM_SOLUTION::get_nb_champ(void)
461     {
462     return nb_champs;
463     }
464    
465     FEM_MAILLAGE* FEM_SOLUTION::get_maillage(void)
466     {
467     return femmai;
468     }
469    
470 francois 375 double FEM_SOLUTION::get_legende_min(int num)
471 francois 283 {
472 francois 375 return solmin[num];
473 francois 283 }
474    
475 francois 375 double FEM_SOLUTION::get_legende_max(int num)
476 francois 283 {
477 francois 375 return solmax[num];
478 francois 283 }
479 francois 375 int FEM_SOLUTION::get_dim_solution(void)
480     {
481     return dim_solution;
482     }
483 francois 283 void FEM_SOLUTION::active_solution(int num)
484     {
485 francois 375 for (int j=0;j<9;j++)
486     {
487     solmax[j]=-1e308;
488     solmin[j]=1e308;
489     }
490 francois 283 int i=0;
491 francois 375 if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_NOEUD)
492 francois 283 {
493     LISTE_FEM_NOEUD::iterator it;
494     for (FEM_NOEUD* no=femmai->get_premier_noeud(it);no!=NULL;no=femmai->get_suivant_noeud(it))
495     {
496 francois 375 for (int k=0;k<dim_solution;k++)
497     {
498     double val=lire(i,num,k);
499     no->change_solution(val,k);
500     if (val<solmin[k]) solmin[k]=val;
501     if (val>solmax[k]) solmax[k]=val;
502     }
503 francois 283 i++;
504     }
505     }
506 francois 375 if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT1)
507 francois 283 {
508 francois 309 LISTE_FEM_ELEMENT1::iterator it;
509     for (FEM_ELEMENT1* seg=femmai->get_premier_element1(it);seg!=NULL;seg=femmai->get_suivant_element1(it))
510 francois 283 {
511 francois 375 for (int k=0;k<dim_solution;k++)
512     {
513     double val=lire(i,num,k);
514     seg->change_solution(val,k);
515     if (val<solmin[k]) solmin[k]=val;
516     if (val>solmax[k]) solmax[k]=val;
517     }
518 francois 283 i++;
519     }
520     }
521 francois 375 if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2)
522 francois 283 {
523 francois 309 LISTE_FEM_ELEMENT2::iterator it;
524     for (FEM_ELEMENT2* tri=femmai->get_premier_element2(it);tri!=NULL;tri=femmai->get_suivant_element2(it))
525 francois 283 {
526 francois 375 for (int k=0;k<dim_solution;k++)
527     {
528     double val=lire(i,num);
529     tri->change_solution(val);
530     if (val<solmin[k]) solmin[k]=val;
531     if (val>solmax[k]) solmax[k]=val;
532     }
533 francois 283 i++;
534     }
535     }
536 francois 375 if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3)
537 francois 283 {
538 francois 309 LISTE_FEM_ELEMENT3::iterator it;
539     for (FEM_ELEMENT3* tet=femmai->get_premier_element3(it);tet!=NULL;tet=femmai->get_suivant_element3(it))
540 francois 283 {
541 francois 375 for (int k=0;k<dim_solution;k++)
542     {
543     double val=lire(i,num);
544     tet->change_solution(val);
545     if (val<solmin[k]) solmin[k]=val;
546     if (val>solmax[k]) solmax[k]=val;
547     }
548 francois 283 i++;
549     }
550     }
551 francois 375 for (int k=0;k<dim_solution;k++)
552     if (OPERATEUR::egal(fabs(solmin[k]-solmax[k]),0.,1e-10)==1)
553     solmax[k]=solmin[k]+1e-10;
554 francois 283 }
555    
556 francois 762
557     double FEM_SOLUTION::get_moyenne_volumique_champs(MG_VOLUME* mgvol,int numchamps,int coord)
558     {
559     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3_GAUSS)
560     {
561     LISTE_FEM_ELEMENT3::iterator it;
562     double unite=femmai->get_mg_geometrie()->get_valeur_unite();
563     int i=0;
564     double val=0.;
565     double vol=0.;
566     for (FEM_ELEMENT3* ele=femmai->get_premier_element3(it);ele!=NULL;ele=femmai->get_suivant_element3(it))
567     {
568     if (mgvol!=NULL)
569     if (ele->get_lien_topologie()!=mgvol) {i++;continue;}
570     int nbgauss=get_nb_gauss(i);
571     double valele=0.0;
572     for (int r=0;r<nbgauss;r++)
573     {
574     int degre=ele->get_degre_gauss(nbgauss);
575     double w;
576     double uvw[3];
577     ele->get_pt_gauss(degre,r,w,uvw);
578     double jac[9];
579     int l,c;
580     double det=ele->get_jacobien(jac,uvw,l,c,unite);
581     double valeur=lire(i,numchamps,coord,r)*fabs(det);
582     valele=valele+w*valeur;
583     vol=vol+w*fabs(det);
584     }
585     val=val+valele;
586     i++;
587     }
588     return val/vol;
589     }
590     return 0;
591     }
592    
593    
594     double FEM_SOLUTION::get_moyenne_surfacique_champs(MG_FACE* fac,int numchamps,int coord)
595     {
596     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2_GAUSS)
597     {
598     LISTE_FEM_ELEMENT2::iterator it;
599     double unite=femmai->get_mg_geometrie()->get_valeur_unite();
600     int i=0;
601     double val=0.;
602     double vol=0.;
603     for (FEM_ELEMENT2* ele=femmai->get_premier_element2(it);ele!=NULL;ele=femmai->get_suivant_element2(it))
604     {
605     if (fac!=NULL)
606     if (ele->get_lien_topologie()!=fac) {i++;continue;}
607     int nbgauss=get_nb_gauss(i);
608     double valele=0.0;
609     for (int r=0;r<nbgauss;r++)
610     {
611     int degre=ele->get_degre_gauss(nbgauss);
612     double w;
613     double uvw[3];
614     ele->get_pt_gauss(degre,r,w,uvw);
615     double jac[9];
616     int l,c;
617     double det=ele->get_jacobien(jac,uvw,l,c,unite);
618     double valeur=lire(i,numchamps,coord,r)*fabs(det);
619     valele=valele+w*valeur;
620     vol=vol+w*fabs(det);
621     }
622     val=val+valele;
623     i++;
624     }
625     return val/vol;
626     }
627     return 0;
628     }
629    
630    
631     double FEM_SOLUTION::get_moyenne_lineique_champs(MG_ARETE* are,int numchamps,int coord)
632     {
633     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT1_GAUSS)
634     {
635     LISTE_FEM_ELEMENT1::iterator it;
636     double unite=femmai->get_mg_geometrie()->get_valeur_unite();
637     int i=0;
638     double val=0.;
639     double vol=0.;
640     for (FEM_ELEMENT1* ele=femmai->get_premier_element1(it);ele!=NULL;ele=femmai->get_suivant_element1(it))
641     {
642     int nbgauss=get_nb_gauss(i);
643     double valele=0.0;
644     for (int r=0;r<nbgauss;r++)
645     {
646     if (are!=NULL)
647     if (ele->get_lien_topologie()!=are) {i++;continue;}
648     int degre=ele->get_degre_gauss(nbgauss);
649     double w;
650     double uvw[3];
651     ele->get_pt_gauss(degre,r,w,uvw);
652     double jac[9];
653     int l,c;
654     double det=ele->get_jacobien(jac,uvw,l,c,unite);
655     double valeur=lire(i,numchamps,coord,r)*fabs(det);
656     valele=valele+w*valeur;
657     vol=vol+w*fabs(det);
658     }
659     val=val+valele;
660     i++;
661     }
662     return val/vol;
663     }
664     return 0;
665     }
666     double FEM_SOLUTION::get_moyenne_volumique_elementaire_champs(int numchamps,FEM_ELEMENT3* ele,int num,int coord)
667     {
668     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3_GAUSS)
669     {
670     double unite=femmai->get_mg_geometrie()->get_valeur_unite();
671     double val=0.;
672     double vol=0.;
673     int nbgauss=get_nb_gauss(num);
674     for (int r=0;r<nbgauss;r++)
675     {
676     int degre=ele->get_degre_gauss(nbgauss);
677     double w;
678     double uvw[3];
679     ele->get_pt_gauss(degre,r,w,uvw);
680     double jac[9];
681     int l,c;
682     double det=ele->get_jacobien(jac,uvw,l,c,unite);
683     double valeur=lire(num,numchamps,coord,r)*fabs(det);
684     val=val+w*valeur;
685     vol=vol+w*fabs(det);
686     }
687     return val/vol;
688     }
689     return 0;
690     }
691    
692     double FEM_SOLUTION::get_moyenne_surfacique_elementaire_champs(int numchamps,FEM_ELEMENT2* ele,int num,int coord)
693     {
694     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2_GAUSS)
695     {
696     double unite=femmai->get_mg_geometrie()->get_valeur_unite();
697     double val=0.;
698     double vol=0.;
699     int nbgauss=get_nb_gauss(num);
700     for (int r=0;r<nbgauss;r++)
701     {
702     int degre=ele->get_degre_gauss(nbgauss);
703     double w;
704     double uvw[3];
705     ele->get_pt_gauss(degre,r,w,uvw);
706     double jac[9];
707     int l,c;
708     double det=ele->get_jacobien(jac,uvw,l,c,unite);
709     double valeur=lire(num,numchamps,coord,r)*fabs(det);
710     val=val+w*valeur;
711     vol=vol+w*fabs(det);
712     }
713     return val/vol;
714     }
715     return 0;
716     }
717    
718     double FEM_SOLUTION::get_moyenne_lineique_elementaire_champs(int numchamps,FEM_ELEMENT1* ele,int num,int coord)
719     {
720     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT1_GAUSS)
721     {
722     double unite=femmai->get_mg_geometrie()->get_valeur_unite();
723     double val=0.;
724     double vol=0.;
725     int nbgauss=get_nb_gauss(num);
726     for (int r=0;r<nbgauss;r++)
727     {
728     int degre=ele->get_degre_gauss(nbgauss);
729     double w;
730     double uvw[3];
731     ele->get_pt_gauss(degre,r,w,uvw);
732     double jac[9];
733     int l,c;
734     double det=ele->get_jacobien(jac,uvw,l,c,unite);
735     double valeur=lire(num,numchamps,coord,r)*fabs(det);
736     val=val+w*valeur;
737     vol=vol+w*fabs(det);
738     }
739     return val/vol;
740     }
741     return 0;
742     }
743    
744    
745    
746 francois 283 std::string FEM_SOLUTION::get_nom(void)
747     {
748     return nomsolution;
749     }
750    
751 francois 326 std::string FEM_SOLUTION::get_nom_fichier(void)
752     {
753     return nom_fichier;
754     }
755 francois 763 void FEM_SOLUTION::enregistrer(std::ostream& o,double version)
756 francois 283 {
757 francois 375 o << "%" << get_id() << "=FEM_SOLUTION(" << typeentite << "," << dim_solution << "," << nomsolution << ",$" << femmai->get_id() << "," << nb_champs << "," << nom_fichier << ",(";
758 francois 283 for (int i=0;i<nb_champs;i++)
759     {
760     o << legende[i];
761     if (i!=nb_champs-1) o<<",";
762     else o<<")";
763     }
764    
765    
766     o << ");" << std::endl;
767     }
768    
769    
770    
771    
772     std::ostream& operator << (std::ostream& o,FEM_SOLUTION& sol)
773     {
774 francois 763 sol.enregistrer(o,VERSIONFICHIER);
775 francois 283 return o;
776     }
777    
778