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