ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mtu/src/fem_solution.cpp
Revision: 1171
Committed: Wed Jul 31 15:43:57 2024 UTC (9 months, 2 weeks ago) by francois
File size: 24786 byte(s)
Log Message:
correction de quelques bug de compilation + misea jour aide + gestion automatique des numéros de version

File Contents

# User Rev Content
1 francois 1158 //####//------------------------------------------------------------
2     //####//------------------------------------------------------------
3     //####// MAGiC
4     //####// Jean Christophe Cuilliere et Vincent FRANCOIS
5     //####// Departement de Genie Mecanique - UQTR
6     //####//------------------------------------------------------------
7     //####// MAGIC est un projet de recherche de l equipe ERICCA
8     //####// du departement de genie mecanique de l Universite du Quebec a Trois Rivieres
9     //####// http://www.uqtr.ca/ericca
10     //####// http://www.uqtr.ca/
11     //####//------------------------------------------------------------
12     //####//------------------------------------------------------------
13     //####//
14     //####// fem_solution.cpp
15     //####//
16     //####//------------------------------------------------------------
17     //####//------------------------------------------------------------
18     //####// COPYRIGHT 2000-2024
19     //####// jeu 13 jun 2024 11:58:54 EDT
20     //####//------------------------------------------------------------
21     //####//------------------------------------------------------------
22 francois 283
23    
24     #include "gestionversion.h"
25     #include <math.h>
26     #include <iostream>
27     #include <stdlib.h>
28     #include <string.h>
29    
30     #include "fem_solution.h"
31     #include "fem_maillage.h"
32 francois 762 #include "mg_geometrie.h"
33 francois 283 #include "ot_mathematique.h"
34 couturad 919 #include "ot_boite_3d.h"
35 francois 283
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     in=NULL;
391     }
392    
393 francois 635 int FEM_SOLUTION::get_entite_solution(void)
394 francois 283 {
395     return typeentite;
396     }
397    
398 francois 375 double FEM_SOLUTION::lire(int i,int j,int coord,int num_no)
399 francois 283 {
400 francois 375 unsigned long nb=hash[0];
401     unsigned long pos=hash[i+1];
402     unsigned long pospro=hash[i+2];
403     int nbval=(pospro-pos)/nb_champs/dim_solution;
404     long posval=(nb+2)*sizeof(unsigned long)+(pos+j*dim_solution*nbval+num_no*dim_solution+coord)*sizeof(double);
405     fseek(in,posval,SEEK_SET);
406 francois 283 double val;
407 francois 375 fread(&val,sizeof(double),1,in);
408 francois 283 return (val);
409     }
410    
411 francois 375 void FEM_SOLUTION::ecrire(double val,int i,int j,int coord,int num_no)
412 francois 283 {
413 francois 375 unsigned long nb=hash[0];
414     unsigned long pos=hash[i+1];
415     unsigned long pospro=hash[i+2];
416     int nbval=(pospro-pos)/nb_champs/dim_solution;
417     long posval=(nb+2)*sizeof(unsigned long)+(pos+j*dim_solution*nbval+num_no*dim_solution+coord)*sizeof(double);
418     fseek(in,posval,SEEK_SET);
419 francois 283 fwrite(&val,sizeof(double),1,in);
420     fflush(in);
421     }
422    
423 francois 757 void FEM_SOLUTION::change_nb_gauss(int i,int num)
424     {
425     if ((typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT1_GAUSS)||(typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2_GAUSS)||(typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3_GAUSS))
426     {
427     unsigned long nb=hash[0];
428     unsigned long pos=hash[i+1];
429     unsigned long oldpospro=hash[i+2];
430     unsigned long pospro=num*nb_champs*dim_solution+pos;
431     hash[i+2]=pospro;
432 francois 859 //unsigned long decalage=pospro-oldpospro;
433     //for (unsigned long j=i+3;j<nb+1;j++)
434     //hash[j]=hash[j]+decalage;
435     change_gauss=true;
436     //fseek(in,0,SEEK_SET);
437     //for (unsigned long j=0;j<nb+2;j++)
438     //fwrite(&(hash[j]),sizeof(unsigned long),1,in);
439 francois 757 }
440    
441     }
442 francois 283
443 francois 757 int FEM_SOLUTION::get_nb_gauss(int i)
444     {
445     if ((typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT1_GAUSS)||(typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2_GAUSS)||(typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3_GAUSS))
446     {
447     unsigned long nb=hash[0];
448     unsigned long pos=hash[i+1];
449     unsigned long pospro=hash[i+2];
450     int nbval=(pospro-pos)/nb_champs/dim_solution;
451     return nbval;
452     }
453     return 0;
454     }
455    
456    
457 francois 283 void FEM_SOLUTION::change_legende(int num,std::string val)
458     {
459     legende[num]=val;
460     }
461    
462     std::string FEM_SOLUTION::get_legende(int num)
463     {
464     return legende[num];
465     }
466    
467     int FEM_SOLUTION::get_nb_champ(void)
468     {
469     return nb_champs;
470     }
471    
472     FEM_MAILLAGE* FEM_SOLUTION::get_maillage(void)
473     {
474     return femmai;
475     }
476    
477 francois 375 double FEM_SOLUTION::get_legende_min(int num)
478 francois 283 {
479 francois 375 return solmin[num];
480 francois 283 }
481    
482 francois 375 double FEM_SOLUTION::get_legende_max(int num)
483 francois 283 {
484 francois 375 return solmax[num];
485 francois 283 }
486 francois 375 int FEM_SOLUTION::get_dim_solution(void)
487     {
488     return dim_solution;
489     }
490 francois 283 void FEM_SOLUTION::active_solution(int num)
491     {
492 francois 375 for (int j=0;j<9;j++)
493     {
494     solmax[j]=-1e308;
495     solmin[j]=1e308;
496     }
497 francois 283 int i=0;
498 francois 375 if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_NOEUD)
499 francois 283 {
500     LISTE_FEM_NOEUD::iterator it;
501     for (FEM_NOEUD* no=femmai->get_premier_noeud(it);no!=NULL;no=femmai->get_suivant_noeud(it))
502     {
503 francois 375 for (int k=0;k<dim_solution;k++)
504     {
505     double val=lire(i,num,k);
506     no->change_solution(val,k);
507     if (val<solmin[k]) solmin[k]=val;
508     if (val>solmax[k]) solmax[k]=val;
509     }
510 francois 283 i++;
511     }
512     }
513 francois 375 if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT1)
514 francois 283 {
515 francois 309 LISTE_FEM_ELEMENT1::iterator it;
516     for (FEM_ELEMENT1* seg=femmai->get_premier_element1(it);seg!=NULL;seg=femmai->get_suivant_element1(it))
517 francois 283 {
518 francois 375 for (int k=0;k<dim_solution;k++)
519     {
520     double val=lire(i,num,k);
521     seg->change_solution(val,k);
522     if (val<solmin[k]) solmin[k]=val;
523     if (val>solmax[k]) solmax[k]=val;
524     }
525 francois 283 i++;
526     }
527     }
528 francois 375 if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2)
529 francois 283 {
530 francois 309 LISTE_FEM_ELEMENT2::iterator it;
531     for (FEM_ELEMENT2* tri=femmai->get_premier_element2(it);tri!=NULL;tri=femmai->get_suivant_element2(it))
532 francois 283 {
533 francois 375 for (int k=0;k<dim_solution;k++)
534     {
535 francois 902 double val=lire(i,num,k);
536     tri->change_solution(val,k);
537 francois 375 if (val<solmin[k]) solmin[k]=val;
538     if (val>solmax[k]) solmax[k]=val;
539     }
540 francois 283 i++;
541     }
542     }
543 francois 375 if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3)
544 francois 283 {
545 francois 309 LISTE_FEM_ELEMENT3::iterator it;
546     for (FEM_ELEMENT3* tet=femmai->get_premier_element3(it);tet!=NULL;tet=femmai->get_suivant_element3(it))
547 francois 283 {
548 francois 375 for (int k=0;k<dim_solution;k++)
549     {
550 francois 902 double val=lire(i,num,k);
551     tet->change_solution(val,k);
552 francois 375 if (val<solmin[k]) solmin[k]=val;
553     if (val>solmax[k]) solmax[k]=val;
554     }
555 francois 283 i++;
556     }
557     }
558 francois 375 for (int k=0;k<dim_solution;k++)
559     if (OPERATEUR::egal(fabs(solmin[k]-solmax[k]),0.,1e-10)==1)
560     solmax[k]=solmin[k]+1e-10;
561 francois 283 }
562    
563 francois 762
564     double FEM_SOLUTION::get_moyenne_volumique_champs(MG_VOLUME* mgvol,int numchamps,int coord)
565     {
566     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3_GAUSS)
567     {
568     LISTE_FEM_ELEMENT3::iterator it;
569     double unite=femmai->get_mg_geometrie()->get_valeur_unite();
570     int i=0;
571     double val=0.;
572     double vol=0.;
573     for (FEM_ELEMENT3* ele=femmai->get_premier_element3(it);ele!=NULL;ele=femmai->get_suivant_element3(it))
574     {
575     if (mgvol!=NULL)
576     if (ele->get_lien_topologie()!=mgvol) {i++;continue;}
577     int nbgauss=get_nb_gauss(i);
578     double valele=0.0;
579     for (int r=0;r<nbgauss;r++)
580     {
581     int degre=ele->get_degre_gauss(nbgauss);
582     double w;
583     double uvw[3];
584     ele->get_pt_gauss(degre,r,w,uvw);
585     double jac[9];
586 francois 1104 double det=ele->get_jacobien(jac,uvw,unite);
587 francois 762 double valeur=lire(i,numchamps,coord,r)*fabs(det);
588     valele=valele+w*valeur;
589     vol=vol+w*fabs(det);
590     }
591     val=val+valele;
592     i++;
593     }
594     return val/vol;
595     }
596     return 0;
597     }
598    
599 couturad 919 double FEM_SOLUTION::get_moyenne_volumique_champs(BOITE_3D &boite_analyse, MG_VOLUME* mgvol, int numchamps, int coord)
600     {
601     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3_GAUSS)
602     {
603     LISTE_FEM_ELEMENT3::iterator it;
604     double unite=femmai->get_mg_geometrie()->get_valeur_unite();
605     int i=0;
606     double val=0.;
607     double vol=0.;
608     for (FEM_ELEMENT3* ele=femmai->get_premier_element3(it);ele!=NULL;ele=femmai->get_suivant_element3(it))
609     {
610     if (mgvol!=NULL)
611     if (ele->get_lien_topologie()!=mgvol) {i++;continue;}
612     double centre[3];
613     ele->get_boite_3D().get_centre(centre);
614     if(boite_analyse.contient(centre[0],centre[1],centre[2])==0) {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 francois 1104 double det=ele->get_jacobien(jac,uvw,unite);
625 couturad 919 double valeur=lire(i,numchamps,coord,r)*fabs(det);
626     valele=valele+w*valeur;
627     vol=vol+w*fabs(det);
628     }
629     val=val+valele;
630     i++;
631     }
632     return val/vol;
633     }
634     return 0;
635     }
636 francois 762
637 couturad 919
638 francois 762 double FEM_SOLUTION::get_moyenne_surfacique_champs(MG_FACE* fac,int numchamps,int coord)
639     {
640     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2_GAUSS)
641     {
642     LISTE_FEM_ELEMENT2::iterator it;
643     double unite=femmai->get_mg_geometrie()->get_valeur_unite();
644     int i=0;
645     double val=0.;
646     double vol=0.;
647     for (FEM_ELEMENT2* ele=femmai->get_premier_element2(it);ele!=NULL;ele=femmai->get_suivant_element2(it))
648     {
649     if (fac!=NULL)
650     if (ele->get_lien_topologie()!=fac) {i++;continue;}
651     int nbgauss=get_nb_gauss(i);
652     double valele=0.0;
653     for (int r=0;r<nbgauss;r++)
654     {
655     int degre=ele->get_degre_gauss(nbgauss);
656     double w;
657     double uvw[3];
658     ele->get_pt_gauss(degre,r,w,uvw);
659     double jac[9];
660 francois 1104 double det=ele->get_jacobien(jac,uvw,unite);
661 francois 762 double valeur=lire(i,numchamps,coord,r)*fabs(det);
662     valele=valele+w*valeur;
663     vol=vol+w*fabs(det);
664     }
665     val=val+valele;
666     i++;
667     }
668     return val/vol;
669     }
670     return 0;
671     }
672    
673    
674     double FEM_SOLUTION::get_moyenne_lineique_champs(MG_ARETE* are,int numchamps,int coord)
675     {
676     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT1_GAUSS)
677     {
678     LISTE_FEM_ELEMENT1::iterator it;
679     double unite=femmai->get_mg_geometrie()->get_valeur_unite();
680     int i=0;
681     double val=0.;
682     double vol=0.;
683     for (FEM_ELEMENT1* ele=femmai->get_premier_element1(it);ele!=NULL;ele=femmai->get_suivant_element1(it))
684     {
685     int nbgauss=get_nb_gauss(i);
686     double valele=0.0;
687     for (int r=0;r<nbgauss;r++)
688     {
689     if (are!=NULL)
690     if (ele->get_lien_topologie()!=are) {i++;continue;}
691     int degre=ele->get_degre_gauss(nbgauss);
692     double w;
693     double uvw[3];
694     ele->get_pt_gauss(degre,r,w,uvw);
695     double jac[9];
696     int l,c;
697 francois 1105 double det=ele->get_jacobien(jac,uvw,unite);
698 francois 762 double valeur=lire(i,numchamps,coord,r)*fabs(det);
699     valele=valele+w*valeur;
700     vol=vol+w*fabs(det);
701     }
702     val=val+valele;
703     i++;
704     }
705     return val/vol;
706     }
707     return 0;
708     }
709     double FEM_SOLUTION::get_moyenne_volumique_elementaire_champs(int numchamps,FEM_ELEMENT3* ele,int num,int coord)
710     {
711     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3_GAUSS)
712     {
713     double unite=femmai->get_mg_geometrie()->get_valeur_unite();
714     double val=0.;
715     double vol=0.;
716     int nbgauss=get_nb_gauss(num);
717     for (int r=0;r<nbgauss;r++)
718     {
719     int degre=ele->get_degre_gauss(nbgauss);
720     double w;
721     double uvw[3];
722     ele->get_pt_gauss(degre,r,w,uvw);
723     double jac[9];
724 francois 1104 double det=ele->get_jacobien(jac,uvw,unite);
725 francois 762 double valeur=lire(num,numchamps,coord,r)*fabs(det);
726     val=val+w*valeur;
727     vol=vol+w*fabs(det);
728     }
729     return val/vol;
730     }
731     return 0;
732     }
733    
734 couturad 919 double FEM_SOLUTION::get_moyenne_volumique_elementaire_champs(int numchamps,FEM_ELEMENT3* ele,int num,double &volume,int coord)
735     {
736     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3_GAUSS)
737     {
738     double unite=femmai->get_mg_geometrie()->get_valeur_unite();
739     double val=0.;
740     volume=0;
741     int nbgauss=get_nb_gauss(num);
742     for (int r=0;r<nbgauss;r++)
743     {
744     int degre=ele->get_degre_gauss(nbgauss);
745     double w;
746     double uvw[3];
747     ele->get_pt_gauss(degre,r,w,uvw);
748     double jac[9];
749 francois 1104 double det=ele->get_jacobien(jac,uvw,unite);
750 couturad 919 double valeur=lire(num,numchamps,coord,r)*fabs(det);
751     val=val+w*valeur;
752     volume=volume+w*fabs(det);
753     }
754     return val/volume;
755     }
756     return 0;
757     }
758    
759    
760 francois 762 double FEM_SOLUTION::get_moyenne_surfacique_elementaire_champs(int numchamps,FEM_ELEMENT2* ele,int num,int coord)
761     {
762     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2_GAUSS)
763     {
764     double unite=femmai->get_mg_geometrie()->get_valeur_unite();
765     double val=0.;
766     double vol=0.;
767     int nbgauss=get_nb_gauss(num);
768     for (int r=0;r<nbgauss;r++)
769     {
770     int degre=ele->get_degre_gauss(nbgauss);
771     double w;
772     double uvw[3];
773     ele->get_pt_gauss(degre,r,w,uvw);
774     double jac[9];
775 francois 1104 double det=ele->get_jacobien(jac,uvw,unite);
776 francois 762 double valeur=lire(num,numchamps,coord,r)*fabs(det);
777     val=val+w*valeur;
778     vol=vol+w*fabs(det);
779     }
780     return val/vol;
781     }
782     return 0;
783     }
784    
785     double FEM_SOLUTION::get_moyenne_lineique_elementaire_champs(int numchamps,FEM_ELEMENT1* ele,int num,int coord)
786     {
787     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT1_GAUSS)
788     {
789     double unite=femmai->get_mg_geometrie()->get_valeur_unite();
790     double val=0.;
791     double vol=0.;
792     int nbgauss=get_nb_gauss(num);
793     for (int r=0;r<nbgauss;r++)
794     {
795     int degre=ele->get_degre_gauss(nbgauss);
796     double w;
797     double uvw[3];
798     ele->get_pt_gauss(degre,r,w,uvw);
799     double jac[9];
800     int l,c;
801 francois 1105 double det=ele->get_jacobien(jac,uvw,unite);
802 francois 762 double valeur=lire(num,numchamps,coord,r)*fabs(det);
803     val=val+w*valeur;
804     vol=vol+w*fabs(det);
805     }
806     return val/vol;
807     }
808     return 0;
809     }
810    
811 couturad 919 double FEM_SOLUTION::get_volume_element(FEM_ELEMENT3* ele, int num)
812     {
813     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3_GAUSS)
814     {
815     double unite=femmai->get_mg_geometrie()->get_valeur_unite();
816     double volume=0;
817     int nbgauss=get_nb_gauss(num);
818     for (int r=0;r<nbgauss;r++)
819     {
820     int degre=ele->get_degre_gauss(nbgauss);
821     double w;
822     double uvw[3];
823     ele->get_pt_gauss(degre,r,w,uvw);
824     double jac[9];
825 francois 1104 double det=ele->get_jacobien(jac,uvw,unite);
826 couturad 919 volume=volume+w*fabs(det);
827     }
828     return volume;
829     }
830     return 0;
831     }
832 francois 762
833    
834 francois 283 std::string FEM_SOLUTION::get_nom(void)
835     {
836     return nomsolution;
837     }
838    
839 francois 326 std::string FEM_SOLUTION::get_nom_fichier(void)
840     {
841     return nom_fichier;
842     }
843 francois 763 void FEM_SOLUTION::enregistrer(std::ostream& o,double version)
844 francois 283 {
845 francois 375 o << "%" << get_id() << "=FEM_SOLUTION(" << typeentite << "," << dim_solution << "," << nomsolution << ",$" << femmai->get_id() << "," << nb_champs << "," << nom_fichier << ",(";
846 francois 283 for (int i=0;i<nb_champs;i++)
847     {
848     o << legende[i];
849     if (i!=nb_champs-1) o<<",";
850     else o<<")";
851     }
852    
853    
854     o << ");" << std::endl;
855     }
856    
857 francois 910 void FEM_SOLUTION::get_fichier_dependant(std::vector<std::string> &liste_fichier)
858     {
859     liste_fichier.push_back(nom_fichier);
860     }
861 francois 283
862    
863     std::ostream& operator << (std::ostream& o,FEM_SOLUTION& sol)
864     {
865 francois 1171 sol.enregistrer(o,MAGIC_VERSION_FICHIER_DOUBLE);
866 francois 283 return o;
867     }
868    
869