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