ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/microstructure/src/mstruct_outils.cpp
Revision: 919
Committed: Tue Mar 6 17:51:54 2018 UTC (7 years, 2 months ago) by couturad
File size: 18554 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 couturad 919 #include "mstruct_outils.h"
2    
3     #include "ot_geometrie.h"
4     #include "mg_maillage.h"
5     #include "fem_maillage.h"
6     #include "mg_cg_forme.h"
7     #include "mg_cg_forme_multi_volume.h"
8     #include "mg_cg_forme_volume.h"
9     #include <math.h>
10    
11     using namespace MICROSTRUCTURE;
12    
13     int OUTILS::fraction_volumique_CAD(VES* ves, GROUPE_FORME* groupe_forme, double& volume, double& fraction_volumique, double precision)
14     {
15     if(groupe_forme!=NULL)
16     {
17     TPL_MAP_ENTITE<MG_VOLUME*> tpl_map_volume = groupe_forme->get_tpl_map_volume();
18     TPL_MAP_ENTITE<MG_VOLUME*>::ITERATEUR it_volume;
19     volume=0;
20     for(MG_VOLUME* vol = tpl_map_volume.get_premier(it_volume);vol!=NULL;vol=tpl_map_volume.get_suivant(it_volume))
21     {
22     volume+=OT_GEOMETRIE::get_volume(vol,precision);
23     }
24     fraction_volumique = volume/ves->get_boite3d_ves().get_volume();
25     return OK;
26     }
27     else
28     {
29     LISTE_MG_VOLUME::iterator it_volume;
30     volume=0;
31     MG_GEOMETRIE* mggeo = ves->get_mg_geometrie();
32     for(MG_VOLUME* vol=mggeo->get_premier_volume(it_volume);vol!=NULL;vol=mggeo->get_suivant_volume(it_volume))
33     {
34     volume+=OT_GEOMETRIE::get_volume(vol,precision);
35     }
36     fraction_volumique = volume/ves->get_boite3d_ves().get_volume();
37     return OK;
38     }
39     }
40    
41     int OUTILS::fraction_volumique_mg_maillage(VES* ves, GROUPE_FORME* groupe_forme, double& volume, double& fraction_volumique)
42     {
43     MG_MAILLAGE *mg_maillage = ves->get_mg_maillage();
44     if(groupe_forme!=NULL)
45     {
46     TPL_MAP_ENTITE<MG_VOLUME*> tpl_map_volume = groupe_forme->get_tpl_map_volume();
47     TPL_MAP_ENTITE<MG_VOLUME*>::ITERATEUR it_volume;
48     volume=0;
49     for(MG_VOLUME* vol = tpl_map_volume.get_premier(it_volume);vol!=NULL;vol=tpl_map_volume.get_suivant(it_volume))
50     {
51     double volume_i;
52     OT_VECTEUR_3D cdm;
53     OT_MATRICE_3D inertieglobale;
54     OT_MATRICE_3D inertiecdm;
55     vol->get_propriete_massique(mg_maillage,volume_i,cdm,inertieglobale,inertiecdm);
56     volume+=volume_i;
57     }
58     fraction_volumique = volume/ves->get_boite3d_ves().get_volume();
59     return OK;
60     }
61     else
62     {
63     LISTE_MG_VOLUME::iterator it_volume;
64     volume=0;
65     MG_GEOMETRIE* mggeo = ves->get_mg_geometrie();
66     for(MG_VOLUME* vol=mggeo->get_premier_volume(it_volume);vol!=NULL;vol=mggeo->get_suivant_volume(it_volume))
67     {
68     double volume_i;
69     OT_VECTEUR_3D cdm;
70     OT_MATRICE_3D inertieglobale;
71     OT_MATRICE_3D inertiecdm;
72     vol->get_propriete_massique(mg_maillage,volume_i,cdm,inertieglobale,inertiecdm);
73     volume+=volume_i;
74     }
75     fraction_volumique = volume/ves->get_boite3d_ves().get_volume();
76     return OK;
77     }
78     }
79    
80    
81     int OUTILS::fraction_volumique_fem_maillage(VES* ves, GROUPE_FORME* groupe_forme, double& volume, double& fraction_volumique,BOITE_3D *boite_analyse)
82     {
83     if(groupe_forme!=NULL)
84     {
85     TPL_MAP_ENTITE<MG_VOLUME*> tpl_map_volume = groupe_forme->get_tpl_map_volume();
86     TPL_MAP_ENTITE<MG_VOLUME*>::ITERATEUR it_volume;
87     volume=0;
88     for(MG_VOLUME* vol = tpl_map_volume.get_premier(it_volume);vol!=NULL;vol=tpl_map_volume.get_suivant(it_volume))
89     {
90     TPL_LISTE_ENTITE<FEM_ELEMENT_MAILLAGE*> *liste_element_maillage=vol->get_lien_fem_maillage();
91     long nb_element=liste_element_maillage->get_nb();
92     for(long j=0;j<nb_element;j++)
93     {
94     FEM_ELEMENT_MAILLAGE* ele=liste_element_maillage->get(j);
95     if(ele->get_dimension()==3)
96     {
97     FEM_ELEMENT3* ele3 = (FEM_ELEMENT3*)ele;
98     if(boite_analyse!=NULL)
99     {
100     double centre[3];
101     ele3->get_boite_3D().get_centre(centre);
102     if(boite_analyse->contient(centre[0],centre[1],centre[2])==0) {continue;}
103     }
104     int nb_pt_gauss=ele3->get_nb_pt_gauss(ele3->get_degremax_fonction_interpolation());
105     for (int r=0;r<nb_pt_gauss;r++)
106     {
107     int degre=ele3->get_degre_gauss(nb_pt_gauss);
108     double w;
109     double uvw[3];
110     ele3->get_pt_gauss(degre,r,w,uvw);
111     double jac[9];
112     int l,c;
113     double det=ele3->get_jacobien(jac,uvw,l,c);
114     volume+=w*det;
115     }
116     }
117     }
118     }
119     if(boite_analyse!=NULL) fraction_volumique = volume/boite_analyse->get_volume();
120     else fraction_volumique = volume/ves->get_boite3d_ves().get_volume();
121     return OK;
122     }
123     else
124     {
125     LISTE_MG_VOLUME::iterator it_volume;
126     volume=0;
127     MG_GEOMETRIE* mggeo = ves->get_mg_geometrie();
128     for(MG_VOLUME* vol=mggeo->get_premier_volume(it_volume);vol!=NULL;vol=mggeo->get_suivant_volume(it_volume))
129     {
130     TPL_LISTE_ENTITE<FEM_ELEMENT_MAILLAGE*> *liste_element_maillage=vol->get_lien_fem_maillage();
131     long nb_element=liste_element_maillage->get_nb();
132     for(long j=0;j<nb_element;j++)
133     {
134     FEM_ELEMENT_MAILLAGE* ele=liste_element_maillage->get(j);
135     if(ele->get_dimension()==3)
136     {
137     FEM_ELEMENT3* ele3 = (FEM_ELEMENT3*)ele;
138     if(boite_analyse!=NULL)
139     {
140     double centre[3];
141     ele3->get_boite_3D().get_centre(centre);
142     if(boite_analyse->contient(centre[0],centre[1],centre[2])==0) {continue;}
143     }
144     int nb_pt_gauss=ele3->get_nb_pt_gauss(ele3->get_degremax_fonction_interpolation());
145     for (int r=0;r<nb_pt_gauss;r++)
146     {
147     int degre=ele3->get_degre_gauss(nb_pt_gauss);
148     double w;
149     double uvw[3];
150     ele3->get_pt_gauss(degre,r,w,uvw);
151     double jac[9];
152     int l,c;
153     double det=ele3->get_jacobien(jac,uvw,l,c);
154     volume+=w*det;
155     }
156     }
157     }
158     }
159     if(boite_analyse!=NULL) fraction_volumique = volume/boite_analyse->get_volume();
160     else fraction_volumique = volume/ves->get_boite3d_ves().get_volume();
161     return OK;
162     }
163     }
164    
165     int OUTILS::moyenne_volumique_champs_e_s(FEM_SOLUTION* sol_e, double* e, FEM_SOLUTION* sol_s, double* s, GROUPE_FORME* groupe_forme)
166     {
167     e[0]=0;e[1]=0;e[2]=0;e[3]=0;e[4]=0;e[5]=0;
168     s[0]=0;s[1]=0;s[2]=0;s[3]=0;s[4]=0;s[5]=0;
169     if(groupe_forme!=NULL)
170     {
171     TPL_MAP_ENTITE<MG_VOLUME*> tpl_map_volume = groupe_forme->get_tpl_map_volume();
172     TPL_MAP_ENTITE<MG_VOLUME*>::ITERATEUR it_volume;
173     for(MG_VOLUME* vol = tpl_map_volume.get_premier(it_volume);vol!=NULL;vol=tpl_map_volume.get_suivant(it_volume))
174     {
175     e[0]+=sol_e->get_moyenne_volumique_champs(vol,0);
176     e[1]+=sol_e->get_moyenne_volumique_champs(vol,1);
177     e[2]+=sol_e->get_moyenne_volumique_champs(vol,2);
178     e[3]+=sol_e->get_moyenne_volumique_champs(vol,3);
179     e[4]+=sol_e->get_moyenne_volumique_champs(vol,4);
180     e[5]+=sol_e->get_moyenne_volumique_champs(vol,5);
181     s[0]+=sol_s->get_moyenne_volumique_champs(vol,0);
182     s[1]+=sol_s->get_moyenne_volumique_champs(vol,1);
183     s[2]+=sol_s->get_moyenne_volumique_champs(vol,2);
184     s[3]+=sol_s->get_moyenne_volumique_champs(vol,3);
185     s[4]+=sol_s->get_moyenne_volumique_champs(vol,4);
186     s[5]+=sol_s->get_moyenne_volumique_champs(vol,5);
187     }
188     int nb_volume = tpl_map_volume.get_nb();
189     e[0]=e[0]/nb_volume;
190     e[1]=e[1]/nb_volume;
191     e[2]=e[2]/nb_volume;
192     e[3]=e[3]/nb_volume;
193     e[4]=e[4]/nb_volume;
194     e[5]=e[5]/nb_volume;
195     s[0]=s[0]/nb_volume;
196     s[1]=s[1]/nb_volume;
197     s[2]=s[2]/nb_volume;
198     s[3]=s[3]/nb_volume;
199     s[4]=s[4]/nb_volume;
200     s[5]=s[5]/nb_volume;
201     return OK;
202     }
203     else
204     {
205     e[0]+=sol_e->get_moyenne_volumique_champs(NULL,0);
206     e[1]+=sol_e->get_moyenne_volumique_champs(NULL,1);
207     e[2]+=sol_e->get_moyenne_volumique_champs(NULL,2);
208     e[3]+=sol_e->get_moyenne_volumique_champs(NULL,3);
209     e[4]+=sol_e->get_moyenne_volumique_champs(NULL,4);
210     e[5]+=sol_e->get_moyenne_volumique_champs(NULL,5);
211     s[0]+=sol_s->get_moyenne_volumique_champs(NULL,0);
212     s[1]+=sol_s->get_moyenne_volumique_champs(NULL,1);
213     s[2]+=sol_s->get_moyenne_volumique_champs(NULL,2);
214     s[3]+=sol_s->get_moyenne_volumique_champs(NULL,3);
215     s[4]+=sol_s->get_moyenne_volumique_champs(NULL,4);
216     s[5]+=sol_s->get_moyenne_volumique_champs(NULL,5);
217     return OK;
218     }
219     }
220    
221    
222     int OUTILS::moyenne_volumique_champs_e_s(FEM_SOLUTION* sol_e, double* e, FEM_SOLUTION* sol_s, double* s, BOITE_3D& boite_analyse, GROUPE_FORME* groupe_forme)
223     {
224     e[0]=0;e[1]=0;e[2]=0;e[3]=0;e[4]=0;e[5]=0;
225     s[0]=0;s[1]=0;s[2]=0;s[3]=0;s[4]=0;s[5]=0;
226     if(groupe_forme!=NULL)
227     {
228     TPL_MAP_ENTITE<MG_VOLUME*> tpl_map_volume = groupe_forme->get_tpl_map_volume();
229     TPL_MAP_ENTITE<MG_VOLUME*>::ITERATEUR it_volume;
230     for(MG_VOLUME* vol = tpl_map_volume.get_premier(it_volume);vol!=NULL;vol=tpl_map_volume.get_suivant(it_volume))
231     {
232     e[0]+=sol_e->get_moyenne_volumique_champs(boite_analyse,vol,0);
233     e[1]+=sol_e->get_moyenne_volumique_champs(boite_analyse,vol,1);
234     e[2]+=sol_e->get_moyenne_volumique_champs(boite_analyse,vol,2);
235     e[3]+=sol_e->get_moyenne_volumique_champs(boite_analyse,vol,3);
236     e[4]+=sol_e->get_moyenne_volumique_champs(boite_analyse,vol,4);
237     e[5]+=sol_e->get_moyenne_volumique_champs(boite_analyse,vol,5);
238     s[0]+=sol_s->get_moyenne_volumique_champs(boite_analyse,vol,0);
239     s[1]+=sol_s->get_moyenne_volumique_champs(boite_analyse,vol,1);
240     s[2]+=sol_s->get_moyenne_volumique_champs(boite_analyse,vol,2);
241     s[3]+=sol_s->get_moyenne_volumique_champs(boite_analyse,vol,3);
242     s[4]+=sol_s->get_moyenne_volumique_champs(boite_analyse,vol,4);
243     s[5]+=sol_s->get_moyenne_volumique_champs(boite_analyse,vol,5);
244     }
245     int nb_volume = tpl_map_volume.get_nb();
246     e[0]=e[0]/nb_volume;
247     e[1]=e[1]/nb_volume;
248     e[2]=e[2]/nb_volume;
249     e[3]=e[3]/nb_volume;
250     e[4]=e[4]/nb_volume;
251     e[5]=e[5]/nb_volume;
252     s[0]=s[0]/nb_volume;
253     s[1]=s[1]/nb_volume;
254     s[2]=s[2]/nb_volume;
255     s[3]=s[3]/nb_volume;
256     s[4]=s[4]/nb_volume;
257     s[5]=s[5]/nb_volume;
258     return OK;
259     }
260     else
261     {
262     e[0]+=sol_e->get_moyenne_volumique_champs(boite_analyse,NULL,0);
263     e[1]+=sol_e->get_moyenne_volumique_champs(boite_analyse,NULL,1);
264     e[2]+=sol_e->get_moyenne_volumique_champs(boite_analyse,NULL,2);
265     e[3]+=sol_e->get_moyenne_volumique_champs(boite_analyse,NULL,3);
266     e[4]+=sol_e->get_moyenne_volumique_champs(boite_analyse,NULL,4);
267     e[5]+=sol_e->get_moyenne_volumique_champs(boite_analyse,NULL,5);
268     s[0]+=sol_s->get_moyenne_volumique_champs(boite_analyse,NULL,0);
269     s[1]+=sol_s->get_moyenne_volumique_champs(boite_analyse,NULL,1);
270     s[2]+=sol_s->get_moyenne_volumique_champs(boite_analyse,NULL,2);
271     s[3]+=sol_s->get_moyenne_volumique_champs(boite_analyse,NULL,3);
272     s[4]+=sol_s->get_moyenne_volumique_champs(boite_analyse,NULL,4);
273     s[5]+=sol_s->get_moyenne_volumique_champs(boite_analyse,NULL,5);
274     return OK;
275     }
276     }
277    
278     int OUTILS::moyenne_volumique_champ(FEM_SOLUTION* sol, double* resultat, GROUPE_FORME* groupe_forme, BOITE_3D* boite_analyse)
279     {
280     int dimension_champ = sol->get_nb_champ();
281     for(int i=0;i<dimension_champ;i++) resultat[i]=0.0;
282     if(groupe_forme!=NULL)
283     {
284     TPL_MAP_ENTITE<MG_VOLUME*> tpl_map_volume = groupe_forme->get_tpl_map_volume();
285     TPL_MAP_ENTITE<MG_VOLUME*>::ITERATEUR it_volume;
286     for(MG_VOLUME* vol = tpl_map_volume.get_premier(it_volume);vol!=NULL;vol=tpl_map_volume.get_suivant(it_volume))
287     {
288     if(boite_analyse!=NULL) for(int i=0;i<dimension_champ;i++) resultat[i]+=sol->get_moyenne_volumique_champs(*boite_analyse,vol,i);
289     else for(int i=0;i<dimension_champ;i++) resultat[i]+=sol->get_moyenne_volumique_champs(vol,i);
290     }
291     int nb_volume = tpl_map_volume.get_nb();
292     for(int i=0;i<dimension_champ;i++) resultat[i]=resultat[i]/nb_volume;
293     return OK;
294     }
295     else
296     {
297     if(boite_analyse!=NULL) for(int i=0;i<dimension_champ;i++) resultat[i]+=sol->get_moyenne_volumique_champs(*boite_analyse,NULL,i);
298     else for(int i=0;i<dimension_champ;i++) resultat[i]+=sol->get_moyenne_volumique_champs(NULL,i);
299     }
300     }
301    
302    
303     int OUTILS::tenseur_orientation(GROUPE_FORME* groupe_forme, double* a2, double precision)
304     {
305     //a2xx a2yy a2zz a2xy a2xz a2yz
306     a2[0]=0; a2[1]=0; a2[2]=0; a2[3]=0; a2[4]=0; a2[5]=0;
307     if(groupe_forme!=NULL)
308     {
309     TPL_MAP_ENTITE<MG_CG_FORME*> tpl_map_forme = groupe_forme->get_tpl_map_forme();
310     TPL_MAP_ENTITE<MG_CG_FORME*>::ITERATEUR it_forme;
311     double volume_total=0;
312     for(MG_CG_FORME* forme=tpl_map_forme.get_premier(it_forme);forme!=NULL;forme=tpl_map_forme.get_suivant(it_forme))
313     {
314     double axe_forme[3];
315     double volume=0;
316     if(groupe_forme->get_axe_forme(forme,axe_forme)==FAIL) return FAIL;
317     if(forme->get_type_forme()==MG_CG_FORME::TYPE_FORME::VOLUME)
318     {
319     MG_CG_FORME_VOLUME *forme_volume = (MG_CG_FORME_VOLUME*)forme;
320     volume = OT_GEOMETRIE::get_volume(forme_volume->get_mg_volume(),precision);
321     }
322     else if(forme->get_type_forme()==MG_CG_FORME::TYPE_FORME::MULTI_VOLUME)
323     {
324     MG_CG_FORME_MULTI_VOLUME* forme_multi_volume = (MG_CG_FORME_MULTI_VOLUME*)forme;
325     std::map<long,MG_VOLUME*>::iterator it_volume;
326     for(MG_VOLUME *vol = forme_multi_volume->get_premier_mg_volume(it_volume);vol!=NULL;vol=forme_multi_volume->get_suivant_mg_volume(it_volume))
327     {
328     volume+=OT_GEOMETRIE::get_volume(vol,precision);
329     }
330     }
331     volume_total+=volume;
332     a2[0] += axe_forme[0]*axe_forme[0]*volume;
333     a2[1] += axe_forme[1]*axe_forme[1]*volume;
334     a2[2] += axe_forme[2]*axe_forme[2]*volume;
335     a2[3] += axe_forme[0]*axe_forme[1]*volume;
336     a2[4] += axe_forme[0]*axe_forme[2]*volume;
337     a2[5] += axe_forme[1]*axe_forme[2]*volume;
338     }
339     a2[0]=a2[0]/volume_total;
340     a2[1]=a2[1]/volume_total;
341     a2[2]=a2[2]/volume_total;
342     a2[3]=a2[3]/volume_total;
343     a2[4]=a2[4]/volume_total;
344     a2[5]=a2[5]/volume_total;
345     }
346     else return FAIL;
347     return OK;
348     }
349    
350     int OUTILS::histogramme_champs_volumique_elements(OT_HISTOGRAMME &histogramme, GROUPE_FORME* groupe_forme,double volume,FEM_SOLUTION* solution, long num_champ)
351     {
352     // FEM_MAILLAGE *femmaill= solution->get_maillage();
353     // LISTE_FEM_ELEMENT3::iterator it;
354     // long i=0;
355     // if(groupe_forme!=NULL)
356     // {
357     // TPL_MAP_ENTITE<MG_VOLUME*> tpl_map_volume = groupe_forme->get_tpl_map_volume();
358     // for(FEM_ELEMENT3* ele=femmaill->get_premier_element3(it);ele!=NULL;ele=femmaill->get_suivant_element3(it))
359     // {
360     // if(tpl_map_volume.existe((MG_VOLUME*)ele->get_lien_topologie())==0) {i++;continue;}
361     // double volume_element;
362     // double valeur = solution->get_moyenne_volumique_elementaire_champs(num_champ,ele,i,volume_element);
363     // histogramme.ajouter(valeur,volume_element/volume);
364     // i++;
365     // }
366     // }
367     // else
368     // {
369     // for(FEM_ELEMENT3* ele=femmaill->get_premier_element3(it);ele!=NULL;ele=femmaill->get_suivant_element3(it))
370     // {
371     // double volume_element;
372     // double valeur = solution->get_moyenne_volumique_elementaire_champs(num_champ,ele,i,volume_element);
373     // histogramme.ajouter(valeur,volume_element/volume);
374     // i++;
375     // }
376     // }
377     // return OK;
378     }
379    
380     int OUTILS::histogramme_champs_volumique_elements(OT_HISTOGRAMME& histogramme, GROUPE_FORME* groupe_forme, FEM_SOLUTION* solution, long int num_champ, BOITE_3D& boite_analyse)
381     {
382     // FEM_MAILLAGE *femmaill= solution->get_maillage();
383     // LISTE_FEM_ELEMENT3::iterator it;
384     // long i=0;
385     // double volume=0;
386     // if(groupe_forme!=NULL)
387     // {
388     // TPL_MAP_ENTITE<MG_VOLUME*> tpl_map_volume = groupe_forme->get_tpl_map_volume();
389     // for(FEM_ELEMENT3* ele=femmaill->get_premier_element3(it);ele!=NULL;ele=femmaill->get_suivant_element3(it))
390     // {
391     // double centre[3];
392     // ele->get_boite_3D().get_centre(centre);
393     // if(boite_analyse.contient(centre[0],centre[1],centre[2])==0) {i++;continue;}
394     // if(tpl_map_volume.existe((MG_VOLUME*)ele->get_lien_topologie())==0) {i++;continue;}
395     // volume+=solution->get_volume_element(ele,i);
396     // i++;
397     // }
398     // i=0;
399     // for(FEM_ELEMENT3* ele=femmaill->get_premier_element3(it);ele!=NULL;ele=femmaill->get_suivant_element3(it))
400     // {
401     // double centre[3];
402     // ele->get_boite_3D().get_centre(centre);
403     // if(boite_analyse.contient(centre[0],centre[1],centre[2])==0) {i++;continue;}
404     // if(tpl_map_volume.existe((MG_VOLUME*)ele->get_lien_topologie())==0) {i++;continue;}
405     // double volume_element;
406     // double valeur = solution->get_moyenne_volumique_elementaire_champs(num_champ,ele,i,volume_element);
407     // histogramme.ajouter(valeur,volume_element/volume);
408     // i++;
409     // }
410     // }
411     // else
412     // {
413     // for(FEM_ELEMENT3* ele=femmaill->get_premier_element3(it);ele!=NULL;ele=femmaill->get_suivant_element3(it))
414     // {
415     // double centre[3];
416     // ele->get_boite_3D().get_centre(centre);
417     // if(boite_analyse.contient(centre[0],centre[1],centre[2])==0) {i++;continue;}
418     // volume+=solution->get_volume_element(ele,i);
419     // i++;
420     // }
421     // for(FEM_ELEMENT3* ele=femmaill->get_premier_element3(it);ele!=NULL;ele=femmaill->get_suivant_element3(it))
422     // {
423     // double volume_element;
424     // double valeur = solution->get_moyenne_volumique_elementaire_champs(num_champ,ele,i,volume_element);
425     // histogramme.ajouter(valeur,volume_element/volume);
426     // i++;
427     // }
428     // }
429     return OK;
430     }
431    
432    
433     int OUTILS::get_valeur_min_max_champs_elements(FEM_SOLUTION* solution, long int num_champ, double& val_min, double& val_max)
434     {
435     val_min=numeric_limits< double >::max();
436     val_max=numeric_limits< double >::min();
437     FEM_MAILLAGE *femmaill= solution->get_maillage();
438     LISTE_FEM_ELEMENT3::iterator it;
439     long i=0;
440     for(FEM_ELEMENT3* ele=femmaill->get_premier_element3(it);ele!=NULL;ele=femmaill->get_suivant_element3(it))
441     {
442     double volume_element;
443     double valeur = solution->get_moyenne_volumique_elementaire_champs(num_champ,ele,i,volume_element);
444     if(valeur>val_max) val_max=valeur;
445     if(valeur<val_min) val_min=valeur;
446     i++;
447     }
448     return OK;
449     }
450    
451     void OUTILS::moyenne_ecart_type(int dim_champ, std::vector< double* > &vector_champ, double* moyenne, double* ecart_type,double *min,double *max)
452     {
453     long nb_echantillions=vector_champ.size();
454     for(int i=0;i<dim_champ;i++)
455     {
456     moyenne[i]=0;
457     ecart_type[i]=0;
458     min[i]=numeric_limits<double>::max();
459     max[i]=numeric_limits<double>::min();
460     }
461     std::vector<double*>::iterator it;
462     for(it=vector_champ.begin();it!=vector_champ.end();it++)
463     {
464     double* champ = *it;
465     for(int i=0;i<dim_champ;i++)
466     {
467     moyenne[i]+=champ[i];
468     if(champ[i]>max[i]) max[i]=champ[i];
469     if(champ[i]<min[i]) min[i]=champ[i];
470     }
471     }
472     for(int i=0;i<dim_champ;i++) moyenne[i]=moyenne[i]/nb_echantillions;
473     for(it=vector_champ.begin();it!=vector_champ.end();it++)
474     {
475     double* champ = *it;
476     for(int i=0;i<dim_champ;i++) ecart_type[i]+=(champ[i]-moyenne[i])*(champ[i]-moyenne[i]);
477     }
478     for(int i=0;i<dim_champ;i++)
479     {
480     ecart_type[i]=ecart_type[i]*(1.0/(nb_echantillions-1.0));
481     ecart_type[i]=sqrt(ecart_type[i]);
482     }
483     }
484    
485    
486    
487    
488    
489    
490    
491    
492    
493    
494    
495    
496    
497    
498    
499    
500    
501    
502    
503    
504    
505    
506    
507    
508    
509