ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/fem_solution.cpp
Revision: 902
Committed: Thu Aug 17 19:51:59 2017 UTC (7 years, 8 months ago) by francois
File size: 22304 byte(s)
Log Message:
tag des noeuds sur les arete d'origine dans la creation de la peau d'une structure optimisée

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