ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/microstructure/src/mstruct_outils.cpp
Revision: 944
Committed: Tue Jun 12 15:51:19 2018 UTC (6 years, 11 months ago) by couturad
File size: 32404 byte(s)
Log Message:
Correction des bugs detectes par Cppcheck

File Contents

# User Rev Content
1 couturad 919 #include "mstruct_outils.h"
2 couturad 926 #include "mg_cg_groupe_forme.h"
3 couturad 919 #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 couturad 926 #include "ot_tenseur.h"
10     #include "mg_cg_info.h"
11     #include "fem_maillage_quadratique_outils.h"
12 couturad 919 #include <math.h>
13    
14     using namespace MICROSTRUCTURE;
15    
16 couturad 926 int OUTILS::statistiques_champ_volumique(FEM_SOLUTION* fem_sol,
17     MG_CG_GROUPE_FORME* groupe_forme,
18     BOITE_3D* boite_analyse,
19     double* moyenne,
20     double* ecart_type,
21     double* min,
22     double* max,
23     OT_HISTOGRAMME** tab_histogramme)
24 couturad 919 {
25 couturad 926 int nb_champ = fem_sol->get_nb_champ();
26     double volume_total=0.0;
27     for(int i=0;i<nb_champ;i++)
28 couturad 919 {
29 couturad 926 moyenne[i]=0.0;
30     ecart_type[i]=0.0;
31     min[i]=numeric_limits< double >::max();
32     max[i]=numeric_limits< double >::min();
33     }
34     std::vector<double*> vector_champ;
35     std::vector<double> vector_volume;
36     LISTE_FEM_ELEMENT3::iterator it;
37     FEM_MAILLAGE* fem_mail = fem_sol->get_maillage();
38     long k=0;
39 couturad 943 for (FEM_ELEMENT3* ele=fem_mail->get_premier_element3(it);ele!=NULL;ele=fem_mail->get_suivant_element3(it))
40 couturad 926 {
41     bool ok=false;
42     if(groupe_forme!=NULL)
43 couturad 919 {
44 couturad 926 TPL_MAP_ENTITE<MG_VOLUME*> tpl_map_volume = groupe_forme->get_tpl_map_volume();
45     TPL_MAP_ENTITE<MG_VOLUME*>::ITERATEUR it_volume;
46     MG_VOLUME* mg_vol=tpl_map_volume.get_premier(it_volume);
47     while(ok==false && mg_vol!=NULL)
48     {
49     if(ele->get_lien_topologie()==mg_vol) ok=true;
50     else mg_vol=tpl_map_volume.get_suivant(it_volume);
51     }
52     } else ok=true;
53     if(boite_analyse!=NULL && ok==true)
54     {
55     BOITE_3D b3d = ele->get_boite_3D();
56     if(!boite_analyse->contient(b3d.get_xcentre(),b3d.get_ycentre(),b3d.get_zcentre())) ok=false;
57 couturad 919 }
58 couturad 926 if(ok==true)
59     {
60     double *champ=new double[nb_champ];
61     double volume;
62     for(int i=0;i<nb_champ;i++)
63     {
64     double unite=fem_mail->get_mg_geometrie()->get_valeur_unite();
65     double val=0.;
66     volume=0;
67     int nbgauss=fem_sol->get_nb_gauss(k);
68     for (int r=0;r<nbgauss;r++)
69 couturad 934 {
70     int degre=ele->get_degre_gauss(nbgauss);
71     double w;
72     double uvw[3];
73     ele->get_pt_gauss(degre,r,w,uvw);
74     double jac[9];
75     int l,c;
76     double det=ele->get_jacobien(jac,uvw,l,c,unite);
77     double valeur=fem_sol->lire(k,i,0,r)*fabs(det);
78     val=val+w*valeur;
79     volume=volume+w*fabs(det);
80     }
81 couturad 926 champ[i] = val;
82     }
83     vector_champ.push_back(champ);
84     vector_volume.push_back(volume);
85     volume_total+=volume;
86     }
87     k++;
88     }
89     long nb_echantillions=vector_champ.size();
90     std::vector<double*>::iterator it_vector_champ;
91     std::vector<double>::iterator it_vector_volume;
92     for(it_vector_champ=vector_champ.begin(),it_vector_volume=vector_volume.begin();it_vector_champ!=vector_champ.end();it_vector_champ++,it_vector_volume++)
93     {
94     double *champ = *it_vector_champ;
95     double volume = *it_vector_volume;
96 couturad 943 for(int i=0;i<nb_champ;i++)
97     {
98     moyenne[i]+=champ[i];
99     if(champ[i]<min[i]) min[i]=champ[i];
100     if(champ[i]>max[i]) max[i]=champ[i];
101     tab_histogramme[i]->ajouter_valeur(champ[i],volume/volume_total);
102     }
103 couturad 919 }
104 couturad 926 for(int i=0;i<nb_champ;i++)
105 couturad 919 {
106 couturad 943 moyenne[i]=moyenne[i]/volume_total;
107 couturad 926 }
108     for(it_vector_champ=vector_champ.begin(),it_vector_volume=vector_volume.begin();it_vector_champ!=vector_champ.end();it_vector_champ++,it_vector_volume++)
109     {
110     double *champ = *it_vector_champ;
111     double volume = *it_vector_volume;
112     for(int i=0;i<nb_champ;i++)
113 couturad 919 {
114 couturad 943 ecart_type[i]+=(champ[i]-moyenne[i])*(champ[i]-moyenne[i]);
115 couturad 919 }
116     }
117 couturad 926 for(it_vector_champ=vector_champ.begin();it_vector_champ!=vector_champ.end();it_vector_champ++) delete [] *it_vector_champ;
118     for(int i=0;i<nb_champ;i++)
119     {
120     ecart_type[i]=ecart_type[i]*(1.0/(nb_echantillions-1.0));
121     ecart_type[i]=sqrt(ecart_type[i]);
122     }
123     return OK;
124 couturad 919 }
125    
126 couturad 926 int OUTILS::statistiques_tenseur_orientation(MG_CG_GROUPE_FORME* groupe_forme,
127     BOITE_3D* boite_analyse,
128     double* moyenne,
129     double* ecart_type,
130     double* min,
131 couturad 938 double* max,
132     bool ponderation_volume)
133 couturad 919 {
134 couturad 938 double volume_total=0;
135 couturad 942 std::vector<double> vector_volume;
136 couturad 926 for(int i=0;i<6;i++)
137 couturad 919 {
138 couturad 926 moyenne[i]=0.0;
139     ecart_type[i]=0.0;
140     min[i]=numeric_limits< double >::max();
141     max[i]=numeric_limits< double >::min();
142 couturad 919 }
143 couturad 926 std::vector<double*> vector_tenseur;
144     std::map<long,MG_CG_FORME*>::iterator it_forme;
145     for(MG_CG_FORME* forme=groupe_forme->get_premiere_mgcg_forme(it_forme);forme!=NULL;forme=groupe_forme->get_suivante_mgcg_forme(it_forme))
146 couturad 919 {
147 couturad 926 BOITE_3D boite_forme = forme->get_boite_3D();
148     bool ok=true;
149     if(boite_analyse!=NULL)
150 couturad 919 {
151 couturad 926 if(boite_analyse->contient(boite_forme.get_xmin(),boite_forme.get_ymin(),boite_forme.get_zmin())) ok=true;
152     else if(boite_analyse->contient(boite_forme.get_xmax(),boite_forme.get_ymin(),boite_forme.get_zmin())) ok=true;
153     else if(boite_analyse->contient(boite_forme.get_xmin(),boite_forme.get_ymax(),boite_forme.get_zmin())) ok=true;
154     else if(boite_analyse->contient(boite_forme.get_xmax(),boite_forme.get_ymax(),boite_forme.get_zmin())) ok=true;
155     else if(boite_analyse->contient(boite_forme.get_xmin(),boite_forme.get_ymin(),boite_forme.get_zmax())) ok=true;
156     else if(boite_analyse->contient(boite_forme.get_xmax(),boite_forme.get_ymin(),boite_forme.get_zmax())) ok=true;
157     else if(boite_analyse->contient(boite_forme.get_xmin(),boite_forme.get_ymax(),boite_forme.get_zmax())) ok=true;
158     else if(boite_analyse->contient(boite_forme.get_xmax(),boite_forme.get_ymax(),boite_forme.get_zmax())) ok=true;
159 couturad 930 else if(boite_forme.contient(boite_analyse->get_xmin(),boite_analyse->get_ymin(),boite_analyse->get_zmin())) ok=true;
160     else if(boite_forme.contient(boite_analyse->get_xmax(),boite_analyse->get_ymin(),boite_analyse->get_zmin())) ok=true;
161     else if(boite_forme.contient(boite_analyse->get_xmin(),boite_analyse->get_ymax(),boite_analyse->get_zmin())) ok=true;
162     else if(boite_forme.contient(boite_analyse->get_xmax(),boite_analyse->get_ymax(),boite_analyse->get_zmin())) ok=true;
163     else if(boite_forme.contient(boite_analyse->get_xmin(),boite_analyse->get_ymin(),boite_analyse->get_zmax())) ok=true;
164     else if(boite_forme.contient(boite_analyse->get_xmax(),boite_analyse->get_ymin(),boite_analyse->get_zmax())) ok=true;
165     else if(boite_forme.contient(boite_analyse->get_xmin(),boite_analyse->get_ymax(),boite_analyse->get_zmax())) ok=true;
166     else if(boite_forme.contient(boite_analyse->get_xmax(),boite_analyse->get_ymax(),boite_analyse->get_zmax())) ok=true;
167 couturad 926 else ok=false;
168 couturad 919 }
169 couturad 926 if(ok)
170     {
171     double axe_forme[3];
172     MG_CG_INFO_VCT_DOUBLE* info_axe = (MG_CG_INFO_VCT_DOUBLE*)forme->get_mgcg_info("AXE");
173     std::vector<double> vct_double = info_axe->get_vct_valeur();
174     axe_forme[0]=vct_double[0];
175     axe_forme[1]=vct_double[1];
176     axe_forme[2]=vct_double[2];
177     double *tenseur = new double[6];
178     tenseur[0] = axe_forme[0]*axe_forme[0];
179     tenseur[1] = axe_forme[1]*axe_forme[1];
180     tenseur[2] = axe_forme[2]*axe_forme[2];
181     tenseur[3] = axe_forme[0]*axe_forme[1];
182     tenseur[4] = axe_forme[0]*axe_forme[2];
183     tenseur[5] = axe_forme[1]*axe_forme[2];
184 couturad 938 if(ponderation_volume)
185     {
186     if(forme->get_type_forme()==MG_CG_FORME::TYPE_FORME::VOLUME)
187     {
188     MG_CG_FORME_VOLUME* forme_volume = (MG_CG_FORME_VOLUME*)forme;
189     double volume=OT_GEOMETRIE::get_volume(forme_volume->get_mg_volume(),1.0e-06);
190 couturad 942 vector_volume.push_back(volume);
191 couturad 938 volume_total+=volume;
192     }
193     else if(forme->get_type_forme()==MG_CG_FORME::TYPE_FORME::MULTI_VOLUME)
194     {
195     MG_CG_FORME_MULTI_VOLUME* forme_multi_volume = (MG_CG_FORME_MULTI_VOLUME*)forme;
196     std::map<long,MG_VOLUME*>::iterator it_volume;
197     double volume=0;
198     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))
199     {
200     volume+=OT_GEOMETRIE::get_volume(vol,1.0e-06);
201     }
202 couturad 942 vector_volume.push_back(volume);
203 couturad 938 volume_total+=volume;
204     }
205     }
206 couturad 926 vector_tenseur.push_back(tenseur);
207     }
208 couturad 919 }
209 couturad 926 long nb_forme=vector_tenseur.size();
210     std::vector<double*>::iterator it_tenseur;
211 couturad 942 std::vector<double>::iterator it_volume=vector_volume.begin();
212 couturad 926 for(it_tenseur=vector_tenseur.begin();it_tenseur!=vector_tenseur.end();it_tenseur++)
213 couturad 919 {
214 couturad 926 double* tenseur = *it_tenseur;
215     for(int i=0;i<6;i++)
216 couturad 919 {
217 couturad 942 if(!ponderation_volume)
218     {
219     moyenne[i]+=tenseur[i];
220     if(tenseur[i]<min[i]) min[i]=tenseur[i];
221     if(tenseur[i]>max[i]) max[i]=tenseur[i];
222     }
223     else
224     {
225     double volume=*it_volume;
226     moyenne[i]+=tenseur[i]*volume/volume_total;
227     if(tenseur[i]<min[i]) min[i]=tenseur[i];
228     if(tenseur[i]>max[i]) max[i]=tenseur[i];
229     }
230 couturad 919 }
231     }
232 couturad 942 if(!ponderation_volume)
233 couturad 926 for(int i=0;i<6;i++)
234 couturad 919 {
235 couturad 926 moyenne[i]=moyenne[i]/nb_forme;
236     }
237     for(it_tenseur=vector_tenseur.begin();it_tenseur!=vector_tenseur.end();it_tenseur++)
238     {
239     double* tenseur = *it_tenseur;
240     for(int i=0;i<6;i++)
241 couturad 919 {
242 couturad 926 ecart_type[i]+=(tenseur[i]-moyenne[i])*(tenseur[i]-moyenne[i]);
243 couturad 919 }
244 couturad 926 delete [] *it_tenseur;
245 couturad 919 }
246 couturad 926 for(int i=0;i<6;i++)
247     {
248     ecart_type[i]=ecart_type[i]*(1.0/(nb_forme-1.0));
249     ecart_type[i]=sqrt(ecart_type[i]);
250     }
251     return OK;
252 couturad 919 }
253    
254 couturad 926 int OUTILS::statistiques_CAO(BOITE_3D boite_VES,
255     TPL_MAP_ENTITE< MG_CG_FORME* >& tpl_map_forme,
256     long int& nb_forme,
257     long int& nb_volume,
258     double& volume_forme_moyenne,
259     double& volume_forme_ecart_type,
260     double& volume_forme_min,
261     double& volume_forme_max,
262     OT_HISTOGRAMME& volume_forme_histogramme,
263     double& volume_total,
264     double& fraction_volumique,
265     double precision)
266 couturad 919 {
267 couturad 926 double volume_ves = boite_VES.get_volume();
268     nb_forme=0;
269     nb_volume=0;
270     volume_forme_moyenne=0;
271     volume_forme_ecart_type=0;
272     volume_forme_min=numeric_limits< double >::max();
273     volume_forme_max=numeric_limits< double >::min();
274     volume_total=0;
275     std::vector<double> vector_volume;
276    
277     TPL_MAP_ENTITE<MG_CG_FORME*>::ITERATEUR it_forme;
278     for(MG_CG_FORME* forme=tpl_map_forme.get_premier(it_forme);forme!=NULL;forme=tpl_map_forme.get_suivant(it_forme))
279 couturad 919 {
280 couturad 926 TPL_MAP_ENTITE<MG_VOLUME*> tpl_map_volume;
281     if(forme->get_type_forme()==MG_CG_FORME::TYPE_FORME::VOLUME)
282 couturad 919 {
283 couturad 926 MG_CG_FORME_VOLUME* forme_volume = (MG_CG_FORME_VOLUME*)forme;
284     tpl_map_volume.ajouter(forme_volume->get_mg_volume());
285 couturad 919 }
286 couturad 926 else if(forme->get_type_forme()==MG_CG_FORME::TYPE_FORME::MULTI_VOLUME)
287     {
288     MG_CG_FORME_MULTI_VOLUME* forme_multi_volume = (MG_CG_FORME_MULTI_VOLUME*)forme;
289     std::map<long,MG_VOLUME*>::iterator it_volume;
290     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))
291     {
292     tpl_map_volume.ajouter(vol);
293     }
294     }
295     double volume_forme=0;
296     nb_volume += tpl_map_volume.get_nb();
297     TPL_MAP_ENTITE<MG_VOLUME*>::ITERATEUR it_mg_volume;
298     for(MG_VOLUME* vol=tpl_map_volume.get_premier(it_mg_volume);vol!=NULL;vol=tpl_map_volume.get_suivant(it_mg_volume))
299     {
300     volume_forme += OT_GEOMETRIE::get_volume(vol,precision);
301     }
302     vector_volume.push_back(volume_forme);
303 couturad 919 }
304 couturad 926 std::vector<double>::iterator it_data;
305     for(it_data=vector_volume.begin();it_data!=vector_volume.end();it_data++)
306 couturad 919 {
307 couturad 926 double volume = *it_data;
308     volume_total+=volume;
309     if(volume<volume_forme_min) volume_forme_min=volume;
310     if(volume>volume_forme_max) volume_forme_max=volume;
311 couturad 919 }
312 couturad 926 for(it_data=vector_volume.begin();it_data!=vector_volume.end();it_data++)
313     {
314     double volume = *it_data;
315     volume_forme_histogramme.ajouter_valeur(volume,volume/volume_total);
316     }
317     nb_forme=vector_volume.size();
318     volume_forme_moyenne=volume_total/nb_forme;
319     if(nb_forme>1)
320     {
321     for(it_data=vector_volume.begin();it_data!=vector_volume.end();it_data++)
322     {
323     double volume = *it_data;
324     volume_forme_ecart_type+=(volume-volume_forme_moyenne)*(volume-volume_forme_moyenne);
325     }
326     volume_forme_ecart_type=volume_forme_ecart_type*(1.0/(nb_forme-1.0));
327     volume_forme_ecart_type=sqrt(volume_forme_ecart_type);
328     }
329     else volume_forme_ecart_type = nan("");
330     fraction_volumique = volume_total/volume_ves;
331 couturad 919 }
332    
333 couturad 926 int OUTILS::statistiques_mg_maillage(BOITE_3D boite_VES,
334     MG_MAILLAGE* mai,
335     TPL_MAP_ENTITE<MG_CG_FORME*> &tpl_map_forme,
336     long &nb_element_2D,long &nb_element_3D,
337     double& qualite_moyenne_2D, double& qualite_ecart_type_2D, double& qualite_min_2D, double& qualite_max_2D, OT_HISTOGRAMME& histogramme_qualite_2D,
338     double& qualite_moyenne_3D, double& qualite_ecart_type_3D, double& qualite_min_3D, double& qualite_max_3D, OT_HISTOGRAMME& histogramme_qualite_3D,
339     double& taille_moyenne_2D, double& taille_ecart_type_2D, double& taille_min_2D, double& taille_max_2D, OT_HISTOGRAMME& histogramme_taille_2D,
340     double& taille_moyenne_3D, double& taille_ecart_type_3D, double& taille_min_3D, double& taille_max_3D, OT_HISTOGRAMME& histogramme_taille_3D,
341     double& volume, double& fraction_volumique)
342 couturad 919 {
343 couturad 926 double volume_ves = boite_VES.get_volume();
344     nb_element_2D=0;nb_element_3D=0;
345     qualite_moyenne_2D=0;qualite_ecart_type_2D=0;qualite_min_2D=numeric_limits< double >::max();;qualite_max_2D=numeric_limits< double >::min();
346     qualite_moyenne_3D=0;qualite_ecart_type_3D=0;qualite_min_3D=numeric_limits< double >::max();;qualite_max_3D=numeric_limits< double >::min();
347     taille_moyenne_2D=0;taille_ecart_type_2D=0;taille_min_2D=numeric_limits< double >::max();;taille_max_2D=numeric_limits< double >::min();
348     taille_moyenne_3D=0;taille_ecart_type_3D=0;taille_min_3D=numeric_limits< double >::max();;taille_max_3D=numeric_limits< double >::min();
349     volume=0;fraction_volumique=0;
350     TPL_MAP_ENTITE<MG_ELEMENT_MAILLAGE*> tpl_map_element_maill_3D;
351     TPL_MAP_ENTITE<MG_ELEMENT_MAILLAGE*> tpl_map_element_maill_2D;
352     TPL_MAP_ENTITE<MG_CG_FORME*>::ITERATEUR it_forme;
353     for(MG_CG_FORME* forme=tpl_map_forme.get_premier(it_forme);forme!=NULL;forme=tpl_map_forme.get_suivant(it_forme))
354 couturad 919 {
355 couturad 926 if(forme->get_type_forme()==MG_CG_FORME::TYPE_FORME::VOLUME)
356 couturad 919 {
357 couturad 926 MG_CG_FORME_VOLUME* forme_volume = (MG_CG_FORME_VOLUME*)forme;
358     TPL_SET<MG_ELEMENT_MAILLAGE*> *tmp_maill = forme_volume->get_mg_volume()->get_lien_maillage();
359     TPL_SET<MG_ELEMENT_MAILLAGE*>::ITERATEUR it_maill;
360     for(MG_ELEMENT_MAILLAGE* ele=tmp_maill->get_premier(it_maill);ele!=NULL;ele=tmp_maill->get_suivant(it_maill)) tpl_map_element_maill_3D.ajouter(ele);
361     TPL_MAP_ENTITE<MG_FACE*> tpl_map_face;
362     OT_GEOMETRIE::get_map_mg_face_sous_jacent(forme_volume->get_mg_volume(),tpl_map_face);
363     TPL_MAP_ENTITE<MG_FACE*>::ITERATEUR it_face;
364     for(MG_FACE* face=tpl_map_face.get_premier(it_face);face!=NULL;face=tpl_map_face.get_suivant(it_face))
365     {
366     tmp_maill = face->get_lien_maillage();
367     for(MG_ELEMENT_MAILLAGE* ele=tmp_maill->get_premier(it_maill);ele!=NULL;ele=tmp_maill->get_suivant(it_maill)) tpl_map_element_maill_2D.ajouter(ele);
368     }
369     double volume_i;
370     OT_VECTEUR_3D cdm;
371     OT_MATRICE_3D inertieglobale;
372     OT_MATRICE_3D inertiecdm;
373     forme_volume->get_mg_volume()->get_propriete_massique(mai,volume_i,cdm,inertieglobale,inertiecdm);
374     volume+=volume_i;
375 couturad 919 }
376 couturad 926 else if(forme->get_type_forme()==MG_CG_FORME::TYPE_FORME::MULTI_VOLUME)
377     {
378     MG_CG_FORME_MULTI_VOLUME* forme_multi_volume = (MG_CG_FORME_MULTI_VOLUME*)forme;
379     std::map<long,MG_VOLUME*>::iterator it_volume;
380     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))
381     {
382     TPL_SET<MG_ELEMENT_MAILLAGE*> *tmp_maill = vol->get_lien_maillage();
383     TPL_SET<MG_ELEMENT_MAILLAGE*>::ITERATEUR it_maill;
384     for(MG_ELEMENT_MAILLAGE* ele=tmp_maill->get_premier(it_maill);ele!=NULL;ele=tmp_maill->get_suivant(it_maill)) tpl_map_element_maill_3D.ajouter(ele);
385     TPL_MAP_ENTITE<MG_FACE*> tpl_map_face;
386     OT_GEOMETRIE::get_map_mg_face_sous_jacent(vol,tpl_map_face);
387     TPL_MAP_ENTITE<MG_FACE*>::ITERATEUR it_face;
388     for(MG_FACE* face=tpl_map_face.get_premier(it_face);face!=NULL;face=tpl_map_face.get_suivant(it_face))
389     {
390     tmp_maill = face->get_lien_maillage();
391     for(MG_ELEMENT_MAILLAGE* ele=tmp_maill->get_premier(it_maill);ele!=NULL;ele=tmp_maill->get_suivant(it_maill)) tpl_map_element_maill_2D.ajouter(ele);
392     }
393     double volume_i;
394     OT_VECTEUR_3D cdm;
395     OT_MATRICE_3D inertieglobale;
396     OT_MATRICE_3D inertiecdm;
397     vol->get_propriete_massique(mai,volume_i,cdm,inertieglobale,inertiecdm);
398     volume+=volume_i;
399     }
400     }
401 couturad 919 }
402 couturad 926 fraction_volumique = volume/volume_ves;
403     std::vector<double> vector_qualite_3D;
404     std::vector<double> vector_taille_3D;
405     LISTE_MG_TETRA::iterator it_tetra;
406     for(MG_TETRA* tet=mai->get_premier_tetra(it_tetra);tet!=NULL;tet=mai->get_suivant_tetra(it_tetra))
407 couturad 919 {
408 couturad 926 if(tpl_map_element_maill_3D.existe(tet))
409     {
410     double qual=OPERATEUR::qualite_tetra(tet->get_noeud1()->get_coord(),tet->get_noeud2()->get_coord(),tet->get_noeud3()->get_coord(),tet->get_noeud4()->get_coord());
411     vector_qualite_3D.push_back(qual);
412     if(qual<qualite_min_3D) qualite_min_3D=qual;
413     if(qual>qualite_max_3D) qualite_max_3D=qual;
414     qualite_moyenne_3D+=qual;
415     double taille=OPERATEUR::taille_tetra(tet->get_noeud1()->get_coord(),tet->get_noeud2()->get_coord(),tet->get_noeud3()->get_coord(),tet->get_noeud4()->get_coord());
416     vector_taille_3D.push_back(taille);
417     if(taille<taille_min_3D) taille_min_3D=taille;
418     if(taille>taille_max_3D) taille_max_3D=taille;
419     taille_moyenne_3D+=taille;
420     nb_element_3D++;
421     }
422     }
423     qualite_moyenne_3D = qualite_moyenne_3D/nb_element_3D;
424     taille_moyenne_3D = taille_moyenne_3D/nb_element_3D;
425     std::vector<double>::iterator it_qual_3D;
426    
427     for(it_qual_3D=vector_qualite_3D.begin();it_qual_3D!=vector_qualite_3D.end();it_qual_3D++)
428     {
429     double qual = *it_qual_3D;
430     qualite_ecart_type_3D+=(qual-qualite_moyenne_3D)*(qual-qualite_moyenne_3D);
431     histogramme_qualite_3D.ajouter_valeur(qual,1.0/nb_element_3D);
432 couturad 919 }
433 couturad 926 qualite_ecart_type_3D=qualite_ecart_type_3D*(1.0/(nb_element_3D-1.0));
434     qualite_ecart_type_3D=sqrt(qualite_ecart_type_3D);
435    
436     std::vector<double>::iterator it_taille_3D;
437     for(it_taille_3D=vector_taille_3D.begin();it_taille_3D!=vector_taille_3D.end();it_taille_3D++)
438 couturad 919 {
439 couturad 926 double taille = *it_taille_3D;
440     taille_ecart_type_3D=(taille-taille_moyenne_3D)*(taille-taille_moyenne_3D);
441     histogramme_taille_3D.ajouter_valeur(taille,1.0/nb_element_3D);
442     }
443     taille_ecart_type_3D=taille_ecart_type_3D*(1.0/(nb_element_3D-1.0));
444     taille_ecart_type_3D=sqrt(taille_ecart_type_3D);
445    
446    
447    
448     std::vector<double> vector_qualite_2D;
449     std::vector<double> vector_taille_2D;
450     LISTE_MG_TRIANGLE::iterator it_tri;
451     for(MG_TRIANGLE* tri=mai->get_premier_triangle(it_tri);tri!=NULL;tri=mai->get_suivant_triangle(it_tri))
452     {
453     if(tpl_map_element_maill_2D.existe(tri))
454 couturad 919 {
455 couturad 926 double qual=OPERATEUR::qualite_triangle(tri->get_noeud1()->get_coord(),tri->get_noeud2()->get_coord(),tri->get_noeud3()->get_coord());
456     vector_qualite_2D.push_back(qual);
457     if(qual<qualite_min_2D) qualite_min_2D=qual;
458     if(qual>qualite_max_2D) qualite_max_2D=qual;
459     qualite_moyenne_2D+=qual;
460     double taille=OPERATEUR::taille_triangle(tri->get_noeud1()->get_coord(),tri->get_noeud2()->get_coord(),tri->get_noeud3()->get_coord());
461     vector_taille_2D.push_back(taille);
462     if(taille<taille_min_2D) taille_min_2D=taille;
463     if(taille>taille_max_2D) taille_max_2D=taille;
464     taille_moyenne_2D+=taille;
465     nb_element_2D++;
466 couturad 919 }
467 couturad 926 }
468     qualite_moyenne_2D = qualite_moyenne_2D/nb_element_2D;
469     taille_moyenne_2D = taille_moyenne_2D/nb_element_2D;
470     std::vector<double>::iterator it_qual_2D;
471    
472     for(it_qual_2D=vector_qualite_2D.begin();it_qual_2D!=vector_qualite_2D.end();it_qual_2D++)
473     {
474     double qual = *it_qual_2D;
475     qualite_ecart_type_2D+=(qual-qualite_moyenne_2D)*(qual-qualite_moyenne_2D);
476     histogramme_qualite_2D.ajouter_valeur(qual,1.0/nb_element_2D);
477 couturad 919 }
478 couturad 926 qualite_ecart_type_2D=qualite_ecart_type_2D*(1.0/(nb_element_2D-1.0));
479     qualite_ecart_type_2D=sqrt(qualite_ecart_type_2D);
480    
481     std::vector<double>::iterator it_taille_2D;
482     for(it_taille_2D=vector_taille_2D.begin();it_taille_2D!=vector_taille_2D.end();it_taille_2D++)
483 couturad 919 {
484 couturad 926 double taille = *it_taille_2D;
485     taille_ecart_type_2D=(taille-taille_moyenne_2D)*(taille-taille_moyenne_2D);
486     histogramme_taille_2D.ajouter_valeur(taille,1.0/nb_element_2D);
487 couturad 919 }
488 couturad 926 taille_ecart_type_2D=taille_ecart_type_2D*(1.0/(nb_element_2D-1.0));
489     taille_ecart_type_2D=sqrt(taille_ecart_type_2D);
490    
491 couturad 919 }
492    
493    
494 couturad 931 int OUTILS::statistiques_fem_maillage(FEM_MAILLAGE* fem,
495 couturad 926 BOITE_3D *boite_analyse,
496     TPL_MAP_ENTITE< MG_CG_FORME* >& tpl_map_forme,
497     long int& nb_element_2D, long int& nb_element_3D,
498     double& jacobien_min_moyenne_2D, double& jacobien_min_ecart_type_2D, double& jacobien_min_min_2D, double& jacobien_min_max_2D, OT_HISTOGRAMME& histogramme_jacobien_min_2D,
499     double& jacobien_max_moyenne_2D, double& jacobien_max_ecart_type_2D, double& jacobien_max_min_2D, double& jacobien_max_max_2D, OT_HISTOGRAMME& histogramme_jacobien_max_2D,
500     double& jacobien_min_moyenne_3D, double& jacobien_min_ecart_type_3D, double& jacobien_min_min_3D, double& jacobien_min_max_3D, OT_HISTOGRAMME& histogramme_jacobien_min_3D,
501     double& jacobien_max_moyenne_3D, double& jacobien_max_ecart_type_3D, double& jacobien_max_min_3D, double& jacobien_max_max_3D, OT_HISTOGRAMME& histogramme_jacobien_max_3D,
502     double& distortion_moyenne_2D, double& distortion_ecart_type_2D, double& distortion_min_2D, double& distortion_max_2D, OT_HISTOGRAMME& histogramme_distortion_2D,
503     double& distortion_moyenne_3D, double& distortion_ecart_type_3D, double& distortion_min_3D, double& distortion_max_3D, OT_HISTOGRAMME& histogramme_distortion_3D,
504     double& volume,
505     double& fraction_volumique)
506 couturad 919 {
507 couturad 931 double volume_ves=0;
508 couturad 926 nb_element_2D=0;nb_element_3D=0;
509     jacobien_min_moyenne_2D=0.0; jacobien_min_ecart_type_2D=0.0; jacobien_min_min_2D=numeric_limits< double >::max(); jacobien_min_max_2D=numeric_limits< double >::min();
510     jacobien_max_moyenne_2D=0.0; jacobien_max_ecart_type_2D=0.0; jacobien_max_min_2D=numeric_limits< double >::max(); jacobien_max_max_2D=numeric_limits< double >::min();
511     jacobien_min_moyenne_3D=0.0; jacobien_min_ecart_type_3D=0.0; jacobien_min_min_3D=numeric_limits< double >::max(); jacobien_min_max_3D=numeric_limits< double >::min();
512     jacobien_max_moyenne_3D=0.0; jacobien_max_ecart_type_3D=0.0; jacobien_max_min_3D=numeric_limits< double >::max(); jacobien_max_max_3D=numeric_limits< double >::min();
513     distortion_moyenne_2D=0.0; distortion_ecart_type_2D=0.0; distortion_min_2D=numeric_limits< double >::max(); distortion_max_2D=numeric_limits< double >::min();
514     distortion_moyenne_3D=0.0; distortion_ecart_type_3D=0.0; distortion_min_3D=numeric_limits< double >::max(); distortion_max_3D=numeric_limits< double >::min();
515     volume=0;
516     fraction_volumique=0;
517    
518 couturad 931 LISTE_FEM_ELEMENT3::iterator it_element3;
519     for(FEM_ELEMENT3* ele3=fem->get_premier_element3(it_element3);ele3!=NULL;ele3=fem->get_suivant_element3(it_element3))
520     {
521     BOITE_3D b3d_ele = ele3->get_boite_3D();
522     if(boite_analyse!=NULL)
523     if(!boite_analyse->contient(b3d_ele.get_xcentre(),b3d_ele.get_ycentre(),b3d_ele.get_zcentre())) continue;
524     int nb_pt_gauss=ele3->get_nb_pt_gauss(ele3->get_degremax_fonction_interpolation());
525     for (int r=0;r<nb_pt_gauss;r++)
526     {
527     int degre=ele3->get_degre_gauss(nb_pt_gauss);
528     double w;
529     double uvw[3];
530     ele3->get_pt_gauss(degre,r,w,uvw);
531     double jac[9];
532     int l,c;
533     double det=ele3->get_jacobien(jac,uvw,l,c);
534     volume_ves+=w*det;
535     }
536     }
537 couturad 926 TPL_MAP_ENTITE<FEM_ELEMENT3*> tpl_map_element_maill_3D;
538     TPL_MAP_ENTITE<FEM_ELEMENT2*> tpl_map_element_maill_2D;
539     TPL_MAP_ENTITE<MG_CG_FORME*>::ITERATEUR it_forme;
540     for(MG_CG_FORME* forme=tpl_map_forme.get_premier(it_forme);forme!=NULL;forme=tpl_map_forme.get_suivant(it_forme))
541 couturad 919 {
542 couturad 926 if(forme->get_type_forme()==MG_CG_FORME::TYPE_FORME::VOLUME)
543 couturad 919 {
544 couturad 926 MG_CG_FORME_VOLUME* forme_volume = (MG_CG_FORME_VOLUME*)forme;
545     TPL_LISTE_ENTITE<FEM_ELEMENT_MAILLAGE*> *tmp_maill = forme_volume->get_mg_volume()->get_lien_fem_maillage();
546     long tmp_nb = tmp_maill->get_nb();
547     for(long i=0;i<tmp_nb;i++)
548 couturad 919 {
549 couturad 926 FEM_ELEMENT3* ele3 = (FEM_ELEMENT3*)tmp_maill->get(i);
550     BOITE_3D b3d_ele = ele3->get_boite_3D();
551     if(boite_analyse!=NULL)
552     if(!boite_analyse->contient(b3d_ele.get_xcentre(),b3d_ele.get_ycentre(),b3d_ele.get_zcentre())) continue;
553     tpl_map_element_maill_3D.ajouter(ele3);
554 couturad 919 }
555 couturad 926 TPL_MAP_ENTITE<MG_FACE*> tpl_map_face;
556     OT_GEOMETRIE::get_map_mg_face_sous_jacent(forme_volume->get_mg_volume(),tpl_map_face);
557     TPL_MAP_ENTITE<MG_FACE*>::ITERATEUR it_face;
558     for(MG_FACE* face=tpl_map_face.get_premier(it_face);face!=NULL;face=tpl_map_face.get_suivant(it_face))
559 couturad 919 {
560 couturad 926 tmp_maill = face->get_lien_fem_maillage();
561     tmp_nb = tmp_maill->get_nb();
562     for(long i=0;i<tmp_nb;i++)
563 couturad 919 {
564 couturad 926 FEM_ELEMENT2* ele2 = (FEM_ELEMENT2*)tmp_maill->get(i);
565     BOITE_3D b3d_ele = ele2->get_boite_3D();
566     if(boite_analyse!=NULL)
567     if(!boite_analyse->contient(b3d_ele.get_xcentre(),b3d_ele.get_ycentre(),b3d_ele.get_zcentre())) continue;
568     tpl_map_element_maill_2D.ajouter(ele2);
569 couturad 919 }
570     }
571     }
572 couturad 926 else if(forme->get_type_forme()==MG_CG_FORME::TYPE_FORME::MULTI_VOLUME)
573     {
574     MG_CG_FORME_MULTI_VOLUME* forme_multi_volume = (MG_CG_FORME_MULTI_VOLUME*)forme;
575     std::map<long,MG_VOLUME*>::iterator it_volume;
576     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))
577     {
578     TPL_LISTE_ENTITE<FEM_ELEMENT_MAILLAGE*> *tmp_maill = vol->get_lien_fem_maillage();
579     long tmp_nb = tmp_maill->get_nb();
580     for(long i=0;i<tmp_nb;i++)
581     {
582     FEM_ELEMENT3* ele3 = (FEM_ELEMENT3*)tmp_maill->get(i);
583     BOITE_3D b3d_ele = ele3->get_boite_3D();
584     if(boite_analyse!=NULL)
585     if(!boite_analyse->contient(b3d_ele.get_xcentre(),b3d_ele.get_ycentre(),b3d_ele.get_zcentre())) continue;
586     tpl_map_element_maill_3D.ajouter(ele3);
587     }
588     TPL_MAP_ENTITE<MG_FACE*> tpl_map_face;
589     OT_GEOMETRIE::get_map_mg_face_sous_jacent(vol,tpl_map_face);
590     TPL_MAP_ENTITE<MG_FACE*>::ITERATEUR it_face;
591     for(MG_FACE* face=tpl_map_face.get_premier(it_face);face!=NULL;face=tpl_map_face.get_suivant(it_face))
592     {
593     tmp_maill = face->get_lien_fem_maillage();
594     tmp_nb = tmp_maill->get_nb();
595     for(long i=0;i<tmp_nb;i++)
596     {
597     FEM_ELEMENT2* ele2 = (FEM_ELEMENT2*)tmp_maill->get(i);
598     BOITE_3D b3d_ele = ele2->get_boite_3D();
599     if(boite_analyse!=NULL)
600     if(!boite_analyse->contient(b3d_ele.get_xcentre(),b3d_ele.get_ycentre(),b3d_ele.get_zcentre())) continue;
601     tpl_map_element_maill_2D.ajouter(ele2);
602     }
603     }
604     }
605     }
606 couturad 919 }
607 couturad 926 nb_element_3D=tpl_map_element_maill_3D.get_nb();
608     nb_element_2D=tpl_map_element_maill_2D.get_nb();
609     std::vector<double> vector_jacobien_min_2D;
610     std::vector<double> vector_jacobien_max_2D;
611     std::vector<double> vector_jacobien_min_3D;
612     std::vector<double> vector_jacobien_max_3D;
613     std::vector<double> vector_distortion_2D;
614     std::vector<double> vector_distortion_3D;
615     FEM_MAILLAGE_QUADRATIQUE_OUTILS ot;
616     TPL_MAP_ENTITE<FEM_ELEMENT3*>::ITERATEUR it_ele3;
617     for(FEM_ELEMENT3* ele3=tpl_map_element_maill_3D.get_premier(it_ele3);ele3!=NULL;ele3=tpl_map_element_maill_3D.get_suivant(it_ele3))
618 couturad 919 {
619 couturad 926 int nb_pt_gauss=ele3->get_nb_pt_gauss(ele3->get_degremax_fonction_interpolation());
620     for (int r=0;r<nb_pt_gauss;r++)
621     {
622     int degre=ele3->get_degre_gauss(nb_pt_gauss);
623     double w;
624     double uvw[3];
625     ele3->get_pt_gauss(degre,r,w,uvw);
626     double jac[9];
627     int l,c;
628     double det=ele3->get_jacobien(jac,uvw,l,c);
629     volume+=w*det;
630     }
631     double jmin=ot.get_jmin(ele3);
632     double jmax=ot.get_jmin(ele3);
633     double distortion = ot.get_distorsion2(ele3);
634     vector_jacobien_min_3D.push_back(jmin);
635     vector_jacobien_max_3D.push_back(jmax);
636     vector_distortion_3D.push_back(distortion);
637     jacobien_min_moyenne_3D+=jmin;
638     jacobien_max_moyenne_3D+=jmax;
639     distortion_moyenne_3D+=distortion;
640 couturad 919 }
641 couturad 926 fraction_volumique=volume/volume_ves;
642     jacobien_min_moyenne_3D=jacobien_min_moyenne_3D/nb_element_3D;
643     jacobien_max_moyenne_3D=jacobien_max_moyenne_3D/nb_element_3D;
644     distortion_moyenne_3D=distortion_moyenne_3D/nb_element_3D;
645     std::vector<double>::iterator it_jac_min_3D=vector_jacobien_min_3D.begin();
646     std::vector<double>::iterator it_jac_max_3D=vector_jacobien_max_3D.begin();
647     std::vector<double>::iterator it_dist_3D=vector_distortion_3D.begin();
648     for(long i=0;i<nb_element_3D;i++)
649 couturad 919 {
650 couturad 926 double jmin=*it_jac_min_3D;
651     double jmax=*it_jac_max_3D;
652     double dist=*it_dist_3D;
653     if(jmin<jacobien_min_min_3D)jacobien_min_min_3D=jmin;
654     if(jmin>jacobien_min_max_3D)jacobien_min_max_3D=jmin;
655     if(jmax<jacobien_max_min_3D)jacobien_max_min_3D=jmax;
656     if(jmax>jacobien_max_max_3D)jacobien_max_max_3D=jmax;
657     if(dist<distortion_min_3D)distortion_min_3D=dist;
658     if(dist>distortion_max_3D)distortion_max_3D=dist;
659     jacobien_min_ecart_type_3D=(jmin-jacobien_min_moyenne_3D)*(jmin-jacobien_min_moyenne_3D);
660     jacobien_max_ecart_type_3D=(jmax-jacobien_max_moyenne_3D)*(jmax-jacobien_max_moyenne_3D);
661     distortion_ecart_type_3D=(dist-distortion_moyenne_3D)*(dist-distortion_moyenne_3D);
662     histogramme_jacobien_min_3D.ajouter_valeur(jmin,1.0/nb_element_3D);
663     histogramme_jacobien_max_3D.ajouter_valeur(jmax,1.0/nb_element_3D);
664     histogramme_distortion_3D.ajouter_valeur(dist,1.0/nb_element_3D);
665     it_jac_min_3D++;
666     it_jac_max_3D++;
667     it_dist_3D++;
668 couturad 919 }
669 couturad 926 jacobien_min_ecart_type_3D=sqrt(jacobien_min_ecart_type_3D*(1.0/(nb_element_3D-1.0)));
670     jacobien_max_ecart_type_3D=sqrt(jacobien_max_ecart_type_3D*(1.0/(nb_element_3D-1.0)));
671     distortion_ecart_type_3D=sqrt(distortion_ecart_type_3D*(1.0/(nb_element_3D-1.0)));
672    
673     TPL_MAP_ENTITE<FEM_ELEMENT2*>::ITERATEUR it_ele2;
674     for(FEM_ELEMENT2* ele2=tpl_map_element_maill_2D.get_premier(it_ele2);ele2!=NULL;ele2=tpl_map_element_maill_2D.get_suivant(it_ele2))
675 couturad 919 {
676 couturad 926 double jmin=ot.get_jmin(ele2);
677     double jmax=ot.get_jmin(ele2);
678     double distortion = ot.get_distorsion2(ele2);
679     vector_jacobien_min_2D.push_back(jmin);
680     vector_jacobien_max_2D.push_back(jmax);
681     vector_distortion_2D.push_back(distortion);
682     jacobien_min_moyenne_2D+=jmin;
683     jacobien_max_moyenne_2D+=jmax;
684     distortion_moyenne_2D+=distortion;
685 couturad 919 }
686 couturad 926 jacobien_min_moyenne_2D=jacobien_min_moyenne_2D/nb_element_2D;
687     jacobien_max_moyenne_2D=jacobien_max_moyenne_2D/nb_element_2D;
688     distortion_moyenne_2D=distortion_moyenne_2D/nb_element_2D;
689     std::vector<double>::iterator it_jac_min_2D=vector_jacobien_min_2D.begin();
690     std::vector<double>::iterator it_jac_max_2D=vector_jacobien_max_2D.begin();
691     std::vector<double>::iterator it_dist_2D=vector_distortion_2D.begin();
692     for(long i=0;i<nb_element_2D;i++)
693 couturad 919 {
694 couturad 926 double jmin=*it_jac_min_2D;
695     double jmax=*it_jac_max_2D;
696     double dist=*it_dist_2D;
697     if(jmin<jacobien_min_min_2D)jacobien_min_min_2D=jmin;
698     if(jmin>jacobien_min_max_2D)jacobien_min_max_2D=jmin;
699     if(jmax<jacobien_max_min_2D)jacobien_max_min_2D=jmax;
700     if(jmax>jacobien_max_max_2D)jacobien_max_max_2D=jmax;
701     if(dist<distortion_min_2D)distortion_min_2D=dist;
702     if(dist>distortion_max_2D)distortion_max_2D=dist;
703     jacobien_min_ecart_type_2D=(jmin-jacobien_min_moyenne_2D)*(jmin-jacobien_min_moyenne_2D);
704     jacobien_max_ecart_type_2D=(jmax-jacobien_max_moyenne_2D)*(jmax-jacobien_max_moyenne_2D);
705     distortion_ecart_type_2D=(dist-distortion_moyenne_2D)*(dist-distortion_moyenne_2D);
706     histogramme_jacobien_min_2D.ajouter_valeur(jmin,1.0/nb_element_2D);
707     histogramme_jacobien_max_2D.ajouter_valeur(jmax,1.0/nb_element_2D);
708     histogramme_distortion_2D.ajouter_valeur(dist,1.0/nb_element_2D);
709     it_jac_min_2D++;
710     it_jac_max_2D++;
711     it_dist_2D++;
712 couturad 919 }
713 couturad 926 jacobien_min_ecart_type_2D=sqrt(jacobien_min_ecart_type_2D*(1.0/(nb_element_2D-1.0)));
714     jacobien_max_ecart_type_2D=sqrt(jacobien_max_ecart_type_2D*(1.0/(nb_element_2D-1.0)));
715     distortion_ecart_type_2D=sqrt(distortion_ecart_type_2D*(1.0/(nb_element_2D-1.0)));
716 couturad 919 }
717    
718    
719    
720    
721    
722    
723    
724    
725    
726