ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/microstructure/src/mstruct_outils.cpp
Revision: 968
Committed: Sun Sep 16 15:27:49 2018 UTC (6 years, 7 months ago) by couturad
File size: 33941 byte(s)
Log Message:
Ajout d'une condition de sortie et d'un renvoi d'erreur pour le mailleur FEM.
Subdivision des fichiers mstruct_analyse.h/.cpp en sous fichiers pour une meilleure lisibilite.
Ajout d'une analyse des modules d'elasticite.
Ajout d'une analyse de l'energie.
Reconfiguration du main de microstructure.exe (suppression d'actions obsolètes).
Reconfiguration des fichiers generer_nb_ves, post_process.

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