ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/fem_solution.cpp
Revision: 919
Committed: Tue Mar 6 17:51:54 2018 UTC (7 years, 2 months ago) by couturad
File size: 24847 byte(s)
Log Message:
Correction des bugs lors de l'execution en mode RELWITHDEBINFO.
Ajouts de fichiers pour la librairie MICROSTRUCTURE

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