ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/microstructure/src/mstruct_outils.cpp
Revision: 974
Committed: Wed Sep 26 15:32:12 2018 UTC (6 years, 7 months ago) by couturad
File size: 34996 byte(s)
Log Message:
MICROSTRUCTURE :  Ajustement de parametres

File Contents

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