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 |
|
|
|