ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/microstructure/src/mstruct_outils.cpp
Revision: 943
Committed: Fri Jun 8 18:47:16 2018 UTC (6 years, 11 months ago) by couturad
File size: 32902 byte(s)
Log Message:
Correction bugs dans MICROSTRUCTURE

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