ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mtu/src/fem_solution.cpp
Revision: 1105
Committed: Thu Sep 22 14:20:42 2022 UTC (2 years, 7 months ago) by francois
Original Path: magic/lib/geometrie/src/fem_solution.cpp
File size: 24741 byte(s)
Log Message:
generalisation du calcul du jacobien au cas 1D
On a un jacobien générique pour les dimensions 1,2 et 3

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 francois 1104 double det=ele->get_jacobien(jac,uvw,unite);
589 francois 762 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 couturad 919 double FEM_SOLUTION::get_moyenne_volumique_champs(BOITE_3D &boite_analyse, MG_VOLUME* mgvol, int numchamps, int coord)
602     {
603     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3_GAUSS)
604     {
605     LISTE_FEM_ELEMENT3::iterator it;
606     double unite=femmai->get_mg_geometrie()->get_valeur_unite();
607     int i=0;
608     double val=0.;
609     double vol=0.;
610     for (FEM_ELEMENT3* ele=femmai->get_premier_element3(it);ele!=NULL;ele=femmai->get_suivant_element3(it))
611     {
612     if (mgvol!=NULL)
613     if (ele->get_lien_topologie()!=mgvol) {i++;continue;}
614     double centre[3];
615     ele->get_boite_3D().get_centre(centre);
616     if(boite_analyse.contient(centre[0],centre[1],centre[2])==0) {i++;continue;}
617     int nbgauss=get_nb_gauss(i);
618     double valele=0.0;
619     for (int r=0;r<nbgauss;r++)
620     {
621     int degre=ele->get_degre_gauss(nbgauss);
622     double w;
623     double uvw[3];
624     ele->get_pt_gauss(degre,r,w,uvw);
625     double jac[9];
626 francois 1104 double det=ele->get_jacobien(jac,uvw,unite);
627 couturad 919 double valeur=lire(i,numchamps,coord,r)*fabs(det);
628     valele=valele+w*valeur;
629     vol=vol+w*fabs(det);
630     }
631     val=val+valele;
632     i++;
633     }
634     return val/vol;
635     }
636     return 0;
637     }
638 francois 762
639 couturad 919
640 francois 762 double FEM_SOLUTION::get_moyenne_surfacique_champs(MG_FACE* fac,int numchamps,int coord)
641     {
642     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2_GAUSS)
643     {
644     LISTE_FEM_ELEMENT2::iterator it;
645     double unite=femmai->get_mg_geometrie()->get_valeur_unite();
646     int i=0;
647     double val=0.;
648     double vol=0.;
649     for (FEM_ELEMENT2* ele=femmai->get_premier_element2(it);ele!=NULL;ele=femmai->get_suivant_element2(it))
650     {
651     if (fac!=NULL)
652     if (ele->get_lien_topologie()!=fac) {i++;continue;}
653     int nbgauss=get_nb_gauss(i);
654     double valele=0.0;
655     for (int r=0;r<nbgauss;r++)
656     {
657     int degre=ele->get_degre_gauss(nbgauss);
658     double w;
659     double uvw[3];
660     ele->get_pt_gauss(degre,r,w,uvw);
661     double jac[9];
662 francois 1104 double det=ele->get_jacobien(jac,uvw,unite);
663 francois 762 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    
675    
676     double FEM_SOLUTION::get_moyenne_lineique_champs(MG_ARETE* are,int numchamps,int coord)
677     {
678     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT1_GAUSS)
679     {
680     LISTE_FEM_ELEMENT1::iterator it;
681     double unite=femmai->get_mg_geometrie()->get_valeur_unite();
682     int i=0;
683     double val=0.;
684     double vol=0.;
685     for (FEM_ELEMENT1* ele=femmai->get_premier_element1(it);ele!=NULL;ele=femmai->get_suivant_element1(it))
686     {
687     int nbgauss=get_nb_gauss(i);
688     double valele=0.0;
689     for (int r=0;r<nbgauss;r++)
690     {
691     if (are!=NULL)
692     if (ele->get_lien_topologie()!=are) {i++;continue;}
693     int degre=ele->get_degre_gauss(nbgauss);
694     double w;
695     double uvw[3];
696     ele->get_pt_gauss(degre,r,w,uvw);
697     double jac[9];
698     int l,c;
699 francois 1105 double det=ele->get_jacobien(jac,uvw,unite);
700 francois 762 double valeur=lire(i,numchamps,coord,r)*fabs(det);
701     valele=valele+w*valeur;
702     vol=vol+w*fabs(det);
703     }
704     val=val+valele;
705     i++;
706     }
707     return val/vol;
708     }
709     return 0;
710     }
711     double FEM_SOLUTION::get_moyenne_volumique_elementaire_champs(int numchamps,FEM_ELEMENT3* ele,int num,int coord)
712     {
713     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3_GAUSS)
714     {
715     double unite=femmai->get_mg_geometrie()->get_valeur_unite();
716     double val=0.;
717     double vol=0.;
718     int nbgauss=get_nb_gauss(num);
719     for (int r=0;r<nbgauss;r++)
720     {
721     int degre=ele->get_degre_gauss(nbgauss);
722     double w;
723     double uvw[3];
724     ele->get_pt_gauss(degre,r,w,uvw);
725     double jac[9];
726 francois 1104 double det=ele->get_jacobien(jac,uvw,unite);
727 francois 762 double valeur=lire(num,numchamps,coord,r)*fabs(det);
728     val=val+w*valeur;
729     vol=vol+w*fabs(det);
730     }
731     return val/vol;
732     }
733     return 0;
734     }
735    
736 couturad 919 double FEM_SOLUTION::get_moyenne_volumique_elementaire_champs(int numchamps,FEM_ELEMENT3* ele,int num,double &volume,int coord)
737     {
738     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3_GAUSS)
739     {
740     double unite=femmai->get_mg_geometrie()->get_valeur_unite();
741     double val=0.;
742     volume=0;
743     int nbgauss=get_nb_gauss(num);
744     for (int r=0;r<nbgauss;r++)
745     {
746     int degre=ele->get_degre_gauss(nbgauss);
747     double w;
748     double uvw[3];
749     ele->get_pt_gauss(degre,r,w,uvw);
750     double jac[9];
751 francois 1104 double det=ele->get_jacobien(jac,uvw,unite);
752 couturad 919 double valeur=lire(num,numchamps,coord,r)*fabs(det);
753     val=val+w*valeur;
754     volume=volume+w*fabs(det);
755     }
756     return val/volume;
757     }
758     return 0;
759     }
760    
761    
762 francois 762 double FEM_SOLUTION::get_moyenne_surfacique_elementaire_champs(int numchamps,FEM_ELEMENT2* ele,int num,int coord)
763     {
764     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2_GAUSS)
765     {
766     double unite=femmai->get_mg_geometrie()->get_valeur_unite();
767     double val=0.;
768     double vol=0.;
769     int nbgauss=get_nb_gauss(num);
770     for (int r=0;r<nbgauss;r++)
771     {
772     int degre=ele->get_degre_gauss(nbgauss);
773     double w;
774     double uvw[3];
775     ele->get_pt_gauss(degre,r,w,uvw);
776     double jac[9];
777 francois 1104 double det=ele->get_jacobien(jac,uvw,unite);
778 francois 762 double valeur=lire(num,numchamps,coord,r)*fabs(det);
779     val=val+w*valeur;
780     vol=vol+w*fabs(det);
781     }
782     return val/vol;
783     }
784     return 0;
785     }
786    
787     double FEM_SOLUTION::get_moyenne_lineique_elementaire_champs(int numchamps,FEM_ELEMENT1* ele,int num,int coord)
788     {
789     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT1_GAUSS)
790     {
791     double unite=femmai->get_mg_geometrie()->get_valeur_unite();
792     double val=0.;
793     double vol=0.;
794     int nbgauss=get_nb_gauss(num);
795     for (int r=0;r<nbgauss;r++)
796     {
797     int degre=ele->get_degre_gauss(nbgauss);
798     double w;
799     double uvw[3];
800     ele->get_pt_gauss(degre,r,w,uvw);
801     double jac[9];
802     int l,c;
803 francois 1105 double det=ele->get_jacobien(jac,uvw,unite);
804 francois 762 double valeur=lire(num,numchamps,coord,r)*fabs(det);
805     val=val+w*valeur;
806     vol=vol+w*fabs(det);
807     }
808     return val/vol;
809     }
810     return 0;
811     }
812    
813 couturad 919 double FEM_SOLUTION::get_volume_element(FEM_ELEMENT3* ele, int num)
814     {
815     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3_GAUSS)
816     {
817     double unite=femmai->get_mg_geometrie()->get_valeur_unite();
818     double volume=0;
819     int nbgauss=get_nb_gauss(num);
820     for (int r=0;r<nbgauss;r++)
821     {
822     int degre=ele->get_degre_gauss(nbgauss);
823     double w;
824     double uvw[3];
825     ele->get_pt_gauss(degre,r,w,uvw);
826     double jac[9];
827 francois 1104 double det=ele->get_jacobien(jac,uvw,unite);
828 couturad 919 volume=volume+w*fabs(det);
829     }
830     return volume;
831     }
832     return 0;
833     }
834 francois 762
835    
836 francois 283 std::string FEM_SOLUTION::get_nom(void)
837     {
838     return nomsolution;
839     }
840    
841 francois 326 std::string FEM_SOLUTION::get_nom_fichier(void)
842     {
843     return nom_fichier;
844     }
845 francois 763 void FEM_SOLUTION::enregistrer(std::ostream& o,double version)
846 francois 283 {
847 francois 375 o << "%" << get_id() << "=FEM_SOLUTION(" << typeentite << "," << dim_solution << "," << nomsolution << ",$" << femmai->get_id() << "," << nb_champs << "," << nom_fichier << ",(";
848 francois 283 for (int i=0;i<nb_champs;i++)
849     {
850     o << legende[i];
851     if (i!=nb_champs-1) o<<",";
852     else o<<")";
853     }
854    
855    
856     o << ");" << std::endl;
857     }
858    
859 francois 910 void FEM_SOLUTION::get_fichier_dependant(std::vector<std::string> &liste_fichier)
860     {
861     liste_fichier.push_back(nom_fichier);
862     }
863 francois 283
864    
865     std::ostream& operator << (std::ostream& o,FEM_SOLUTION& sol)
866     {
867 francois 763 sol.enregistrer(o,VERSIONFICHIER);
868 francois 283 return o;
869     }
870    
871