ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/microstructure/src/mstruct_outils.cpp
Revision: 1104
Committed: Fri Sep 16 19:46:33 2022 UTC (2 years, 11 months ago) by francois
File size: 55039 byte(s)
Log Message:
Generalisation du calcul du Jacobien en 2D et 3D

File Contents

# Content
1 #include "mstruct_outils.h"
2 #include "mg_cg_groupe_forme.h"
3 #include "ot_geometrie.h"
4 #include "mg_geometrie.h"
5 #include "mg_maillage.h"
6 #include "fem_maillage.h"
7 #include "mg_cg_forme.h"
8 #include "mg_cg_forme_multi_volume.h"
9 #include "mg_cg_forme_volume.h"
10 #include "ot_tenseur.h"
11 #include "mg_cg_info.h"
12 #include "fem_maillage_quadratique_outils.h"
13 #include <math.h>
14 #include "mstruct_definition.h"
15
16
17 int MSTRUCT_OUTILS::statistiques_champ_volumique(FEM_SOLUTION* fem_sol,
18 MG_CG_GROUPE_FORME* groupe_forme,
19 BOITE_3D* boite_analyse,
20 double* moyenne,
21 double* ecart_type,
22 double* min,
23 double* max,
24 OT_HISTOGRAMME** tab_histogramme)
25 {
26 int nb_champ = fem_sol->get_nb_champ();
27 double volume_total=0.0;
28 for(int i=0;i<nb_champ;i++)
29 {
30 moyenne[i]=0.0;
31 ecart_type[i]=0.0;
32 min[i]=std::numeric_limits< double >::max();
33 max[i]=std::numeric_limits< double >::min();
34 }
35 std::vector<double*> vector_champ;
36 std::vector<double> vector_volume;
37 LISTE_FEM_ELEMENT3::iterator it;
38 FEM_MAILLAGE* fem_mail = fem_sol->get_maillage();
39 if(fem_sol->get_entite_solution()==MAGIC::ENTITE_SOLUTION::ENTITE_NOEUD) fem_sol->active_solution(0);
40 long k=0;
41 for (FEM_ELEMENT3* ele=fem_mail->get_premier_element3(it);ele!=NULL;ele=fem_mail->get_suivant_element3(it))
42 {
43 bool ok=false;
44 if(groupe_forme!=NULL)
45 {
46 TPL_MAP_ENTITE<MG_VOLUME*> tpl_map_volume = groupe_forme->get_tpl_map_volume();
47 TPL_MAP_ENTITE<MG_VOLUME*>::ITERATEUR it_volume;
48 MG_VOLUME* mg_vol=tpl_map_volume.get_premier(it_volume);
49 while(ok==false && mg_vol!=NULL)
50 {
51 if(ele->get_lien_topologie()==mg_vol) ok=true;
52 else mg_vol=tpl_map_volume.get_suivant(it_volume);
53 }
54 } else ok=true;
55 if(boite_analyse!=NULL && ok==true)
56 {
57 BOITE_3D b3d = ele->get_boite_3D();
58 if(!boite_analyse->contient(b3d.get_xcentre(),b3d.get_ycentre(),b3d.get_zcentre())) ok=false;
59 }
60 if(ok==true)
61 {
62 double *champ=new double[nb_champ];
63 double volume;
64 for(int i=0;i<nb_champ;i++)
65 {
66 double unite=fem_mail->get_mg_geometrie()->get_valeur_unite();
67 double val=0.;
68 volume=0;
69 if(fem_sol->get_entite_solution()==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3_GAUSS)
70 {
71 int nbgauss=fem_sol->get_nb_gauss(k);
72 for (int r=0;r<nbgauss;r++)
73 {
74 int degre=ele->get_degre_gauss(nbgauss);
75 double w;
76 double uvw[3];
77 ele->get_pt_gauss(degre,r,w,uvw);
78 double jac[9];
79 double det=ele->get_jacobien(jac,uvw,unite);
80 double valeur=fem_sol->lire(k,i,0,r)*fabs(det);
81 val=val+w*valeur;
82 volume=volume+w*fabs(det);
83 }
84 }
85 else if(fem_sol->get_entite_solution()==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3)
86 {
87 int nb_pt_gauss=ele->get_nb_pt_gauss(ele->get_degremax_fonction_interpolation());
88 for (int r=0;r<nb_pt_gauss;r++)
89 {
90 int degre=ele->get_degre_gauss(nb_pt_gauss);
91 double w;
92 double uvw[3];
93 ele->get_pt_gauss(degre,r,w,uvw);
94 double jac[9];
95 double det=ele->get_jacobien(jac,uvw);
96 volume+=w*fabs(det);
97 }
98 val=fem_sol->lire(k,i,0,0)*volume;
99 }
100 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 double degmax=ele->get_degremax_fonction_interpolation();
106 int nbfonc=ele->get_nb_fonction_interpolation();
107 int nb_pt_gauss=ele->get_nb_pt_gauss(degmax);
108 for (int r=0;r<nb_pt_gauss;r++)
109 {
110 ele->get_pt_gauss(degmax,r,w,uvw);
111 double detJ=ele->get_jacobien(jac,uvw,unite);
112 double C=0.0;
113 for(int j=0;j<nbfonc;j++)
114 {
115 C+=ele->get_fonction_interpolation(j+1,uvw)*ele->get_fem_noeud(j)->get_solution()*(pow(unite,3));
116 }
117 C=C*w*fabs(detJ);
118 val+=C;
119 volume+=w*fabs(detJ);
120 }
121 }
122 champ[i] = val;
123 }
124 vector_champ.push_back(champ);
125 vector_volume.push_back(volume);
126 volume_total+=volume;
127 }
128 k++;
129 }
130 long nb_echantillions=vector_champ.size();
131 std::vector<double*>::iterator it_vector_champ;
132 std::vector<double>::iterator it_vector_volume=vector_volume.begin();
133 for(it_vector_champ=vector_champ.begin();it_vector_champ!=vector_champ.end();it_vector_champ++)
134 {
135 double *champ = *it_vector_champ;
136 double volume = *it_vector_volume;
137 for(int i=0;i<nb_champ;i++)
138 {
139 moyenne[i]+=champ[i];
140 if((champ[i]/volume)<min[i]) min[i]=champ[i]/volume;
141 if((champ[i]/volume)>max[i]) max[i]=champ[i]/volume;
142 tab_histogramme[i]->ajouter_valeur(champ[i]/volume,volume/volume_total);
143 }
144 it_vector_volume++;
145 }
146 for(int i=0;i<nb_champ;i++)
147 {
148 moyenne[i]=moyenne[i]/volume_total;
149 }
150 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++)
151 {
152 double *champ = *it_vector_champ;
153 double volume = *it_vector_volume;
154 for(int i=0;i<nb_champ;i++)
155 {
156 ecart_type[i]+=((champ[i]/volume)-moyenne[i])*((champ[i]/volume)-moyenne[i]);
157 }
158 }
159 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 }
167
168 int MSTRUCT_OUTILS::statistiques_tenseur_orientation(MG_CG_GROUPE_FORME* groupe_forme,
169 BOITE_3D* boite_analyse,
170 double* moyenne,
171 double* ecart_type,
172 double* min,
173 double* max,
174 FEM_MAILLAGE *fem,
175 bool ponderation_volume)
176 {
177 double volume_total=0;
178 std::vector<double> vector_volume;
179 for(int i=0;i<6;i++)
180 {
181 moyenne[i]=0.0;
182 ecart_type[i]=0.0;
183 min[i]=std::numeric_limits< double >::max();
184 max[i]=std::numeric_limits< double >::min();
185 }
186 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 {
190 BOITE_3D boite_forme = forme->get_boite_3D();
191 bool ok=true;
192 if(boite_analyse!=NULL)
193 {
194 if(boite_analyse->get_intersection(boite_forme)) ok=true;
195 else ok=false;
196 }
197 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 if(ponderation_volume)
213 {
214 if(fem==NULL)
215 {
216 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 }
236 else
237 {
238 double volume=get_volume_mgcg_forme(forme,fem,boite_analyse);
239 vector_volume.push_back(volume);
240 volume_total+=volume;
241 }
242 }
243 vector_tenseur.push_back(tenseur);
244 }
245 }
246 long nb_forme=vector_tenseur.size();
247 std::vector<double*>::iterator it_tenseur;
248 std::vector<double>::iterator it_volume=vector_volume.begin();
249 for(it_tenseur=vector_tenseur.begin();it_tenseur!=vector_tenseur.end();it_tenseur++)
250 {
251 double* tenseur = *it_tenseur;
252 for(int i=0;i<6;i++)
253 {
254 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 }
268 it_volume++;
269 }
270 if(!ponderation_volume)
271 for(int i=0;i<6;i++)
272 {
273 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 {
280 ecart_type[i]+=(tenseur[i]-moyenne[i])*(tenseur[i]-moyenne[i]);
281 }
282 delete [] *it_tenseur;
283 }
284 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 }
291
292 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 {
305 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 volume_forme_min=std::numeric_limits< double >::max();
311 volume_forme_max=std::numeric_limits< double >::min();
312 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 {
318 TPL_MAP_ENTITE<MG_VOLUME*> tpl_map_volume;
319 if(forme->get_type_forme()==MG_CG_FORME::TYPE_FORME::VOLUME)
320 {
321 MG_CG_FORME_VOLUME* forme_volume = (MG_CG_FORME_VOLUME*)forme;
322 tpl_map_volume.ajouter(forme_volume->get_mg_volume());
323 }
324 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 }
342 std::vector<double>::iterator it_data;
343 for(it_data=vector_volume.begin();it_data!=vector_volume.end();it_data++)
344 {
345 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 }
350 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 else volume_forme_ecart_type = 0.0;
368 fraction_volumique = volume_total/volume_ves;
369 return 0;
370 }
371
372 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 {
382 double volume_ves = boite_VES.get_volume();
383 nb_element_2D=0;nb_element_3D=0;
384 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 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 {
394 if(forme->get_type_forme()==MG_CG_FORME::TYPE_FORME::VOLUME)
395 {
396 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,masse_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,masse_i,cdm,inertieglobale,inertiecdm);
413 volume+=volume_i;
414 }
415 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,masse_i;
433 OT_VECTEUR_3D cdm;
434 OT_MATRICE_3D inertieglobale;
435 OT_MATRICE_3D inertiecdm;
436 vol->get_propriete_massique(mai,volume_i,masse_i,cdm,inertieglobale,inertiecdm);
437 volume+=volume_i;
438 }
439 }
440 }
441 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 {
447 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 }
472 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 {
478 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 {
494 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 }
506 }
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 }
517 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 {
523 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 }
527 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 return 0;
530 }
531
532
533 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 {
546 double volume_ves=0;
547 nb_element_2D=0;nb_element_3D=0;
548 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 volume=0;
555 fraction_volumique=0;
556
557 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 double det=ele3->get_jacobien(jac,uvw);
572 volume_ves+=w*det;
573 }
574 }
575 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 {
580 if(forme->get_type_forme()==MG_CG_FORME::TYPE_FORME::VOLUME)
581 {
582 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 {
587 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 }
593 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 {
598 tmp_maill = face->get_lien_fem_maillage();
599 tmp_nb = tmp_maill->get_nb();
600 for(long i=0;i<tmp_nb;i++)
601 {
602 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 }
608 }
609 }
610 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 }
645 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 {
657 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 double det=ele3->get_jacobien(jac,uvw);
666 volume+=w*det;
667 }
668 double jmin=ot.get_jmin(ele3);
669 double jmax=ot.get_jmin(ele3);
670 double distortion = ot.get_distorsion2(ele3);
671 vector_jacobien_min_3D.push_back(jmin);
672 vector_jacobien_max_3D.push_back(jmax);
673 vector_distortion_3D.push_back(distortion);
674 jacobien_min_moyenne_3D+=jmin;
675 jacobien_max_moyenne_3D+=jmax;
676 distortion_moyenne_3D+=distortion;
677 }
678 fraction_volumique=volume/volume_ves;
679 jacobien_min_moyenne_3D=jacobien_min_moyenne_3D/nb_element_3D;
680 jacobien_max_moyenne_3D=jacobien_max_moyenne_3D/nb_element_3D;
681 distortion_moyenne_3D=distortion_moyenne_3D/nb_element_3D;
682 std::vector<double>::iterator it_jac_min_3D=vector_jacobien_min_3D.begin();
683 std::vector<double>::iterator it_jac_max_3D=vector_jacobien_max_3D.begin();
684 std::vector<double>::iterator it_dist_3D=vector_distortion_3D.begin();
685 for(long i=0;i<nb_element_3D;i++)
686 {
687 double jmin=*it_jac_min_3D;
688 double jmax=*it_jac_max_3D;
689 double dist=*it_dist_3D;
690 if(jmin<jacobien_min_min_3D)jacobien_min_min_3D=jmin;
691 if(jmin>jacobien_min_max_3D)jacobien_min_max_3D=jmin;
692 if(jmax<jacobien_max_min_3D)jacobien_max_min_3D=jmax;
693 if(jmax>jacobien_max_max_3D)jacobien_max_max_3D=jmax;
694 if(dist<distortion_min_3D)distortion_min_3D=dist;
695 if(dist>distortion_max_3D)distortion_max_3D=dist;
696 jacobien_min_ecart_type_3D=(jmin-jacobien_min_moyenne_3D)*(jmin-jacobien_min_moyenne_3D);
697 jacobien_max_ecart_type_3D=(jmax-jacobien_max_moyenne_3D)*(jmax-jacobien_max_moyenne_3D);
698 distortion_ecart_type_3D=(dist-distortion_moyenne_3D)*(dist-distortion_moyenne_3D);
699 histogramme_jacobien_min_3D.ajouter_valeur(jmin,1.0/nb_element_3D);
700 histogramme_jacobien_max_3D.ajouter_valeur(jmax,1.0/nb_element_3D);
701 histogramme_distortion_3D.ajouter_valeur(dist,1.0/nb_element_3D);
702 it_jac_min_3D++;
703 it_jac_max_3D++;
704 it_dist_3D++;
705 }
706 jacobien_min_ecart_type_3D=sqrt(jacobien_min_ecart_type_3D*(1.0/(nb_element_3D-1.0)));
707 jacobien_max_ecart_type_3D=sqrt(jacobien_max_ecart_type_3D*(1.0/(nb_element_3D-1.0)));
708 distortion_ecart_type_3D=sqrt(distortion_ecart_type_3D*(1.0/(nb_element_3D-1.0)));
709
710 TPL_MAP_ENTITE<FEM_ELEMENT2*>::ITERATEUR it_ele2;
711 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))
712 {
713 double jmin=ot.get_jmin(ele2);
714 double jmax=ot.get_jmin(ele2);
715 double distortion = ot.get_distorsion2(ele2);
716 vector_jacobien_min_2D.push_back(jmin);
717 vector_jacobien_max_2D.push_back(jmax);
718 vector_distortion_2D.push_back(distortion);
719 jacobien_min_moyenne_2D+=jmin;
720 jacobien_max_moyenne_2D+=jmax;
721 distortion_moyenne_2D+=distortion;
722 }
723 jacobien_min_moyenne_2D=jacobien_min_moyenne_2D/nb_element_2D;
724 jacobien_max_moyenne_2D=jacobien_max_moyenne_2D/nb_element_2D;
725 distortion_moyenne_2D=distortion_moyenne_2D/nb_element_2D;
726 std::vector<double>::iterator it_jac_min_2D=vector_jacobien_min_2D.begin();
727 std::vector<double>::iterator it_jac_max_2D=vector_jacobien_max_2D.begin();
728 std::vector<double>::iterator it_dist_2D=vector_distortion_2D.begin();
729 for(long i=0;i<nb_element_2D;i++)
730 {
731 double jmin=*it_jac_min_2D;
732 double jmax=*it_jac_max_2D;
733 double dist=*it_dist_2D;
734 if(jmin<jacobien_min_min_2D)jacobien_min_min_2D=jmin;
735 if(jmin>jacobien_min_max_2D)jacobien_min_max_2D=jmin;
736 if(jmax<jacobien_max_min_2D)jacobien_max_min_2D=jmax;
737 if(jmax>jacobien_max_max_2D)jacobien_max_max_2D=jmax;
738 if(dist<distortion_min_2D)distortion_min_2D=dist;
739 if(dist>distortion_max_2D)distortion_max_2D=dist;
740 jacobien_min_ecart_type_2D=(jmin-jacobien_min_moyenne_2D)*(jmin-jacobien_min_moyenne_2D);
741 jacobien_max_ecart_type_2D=(jmax-jacobien_max_moyenne_2D)*(jmax-jacobien_max_moyenne_2D);
742 distortion_ecart_type_2D=(dist-distortion_moyenne_2D)*(dist-distortion_moyenne_2D);
743 histogramme_jacobien_min_2D.ajouter_valeur(jmin,1.0/nb_element_2D);
744 histogramme_jacobien_max_2D.ajouter_valeur(jmax,1.0/nb_element_2D);
745 histogramme_distortion_2D.ajouter_valeur(dist,1.0/nb_element_2D);
746 it_jac_min_2D++;
747 it_jac_max_2D++;
748 it_dist_2D++;
749 }
750 jacobien_min_ecart_type_2D=sqrt(jacobien_min_ecart_type_2D*(1.0/(nb_element_2D-1.0)));
751 jacobien_max_ecart_type_2D=sqrt(jacobien_max_ecart_type_2D*(1.0/(nb_element_2D-1.0)));
752 distortion_ecart_type_2D=sqrt(distortion_ecart_type_2D*(1.0/(nb_element_2D-1.0)));
753 return 0;
754
755 }
756
757
758 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 double det=ele3->get_jacobien(jac,uvw);
806 volume+=w*det;
807 }
808 }
809 return volume;
810 }
811
812 int MSTRUCT_OUTILS::appliquer_conditions_limites_plan(TPL_MAP_ENTITE< MG_FACE* >* plan, char* condition, double valeur,bool topo_sous_jacente)
813 {
814 TPL_MAP_ENTITE<MG_FACE*>::ITERATEUR it_face_plan;
815 for(MG_FACE *face = plan->get_premier(it_face_plan);face!=NULL;face=plan->get_suivant(it_face_plan))
816 {
817 face->ajouter_ccf(condition,valeur);
818 if(topo_sous_jacente==true)
819 {
820 TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*> map_topo;
821 face->get_topologie_sousjacente(&map_topo);
822 TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*>::ITERATEUR it_topo;
823 for(MG_ELEMENT_TOPOLOGIQUE *topo=map_topo.get_premier(it_topo);topo!=NULL;topo=map_topo.get_suivant(it_topo))
824 {
825 topo->ajouter_ccf(condition,valeur);
826 }
827 }
828 }
829 return 0;
830
831 }
832
833 int MSTRUCT_OUTILS::appliquer_conditions_limites_plan(TPL_MAP_ENTITE< MG_FACE* >* plan, char* condition, std::string formule,std::vector<std::string> &listvariable,bool topo_sous_jacente)
834 {
835 TPL_MAP_ENTITE<MG_FACE*>::ITERATEUR it_face_plan;
836 for(MG_FACE *face = plan->get_premier(it_face_plan);face!=NULL;face=plan->get_suivant(it_face_plan))
837 {
838 face->ajouter_ccf(condition,formule,listvariable);
839 if(topo_sous_jacente==true)
840 {
841 TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*> map_topo;
842 face->get_topologie_sousjacente(&map_topo);
843 TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*>::ITERATEUR it_topo;
844 for(MG_ELEMENT_TOPOLOGIQUE *topo=map_topo.get_premier(it_topo);topo!=NULL;topo=map_topo.get_suivant(it_topo))
845 {
846 topo->ajouter_ccf(condition,formule,listvariable);
847 }
848 }
849 }
850 return 0;
851
852 }
853
854 int MSTRUCT_OUTILS::appliquer_conditions_limites(MG_GEOMETRIE* m_mg_geometrie,BOITE_3D boite3D_ves,int Type_etude, int Type_CL, int Type_Chargement, double Valeur_CL, int Direction, double eps)
855 {
856 TPL_MAP_ENTITE<MG_FACE*> plan_xy_z0;
857 TPL_MAP_ENTITE<MG_FACE*> plan_xy_z1;
858 TPL_MAP_ENTITE<MG_FACE*> plan_yz_x0;
859 TPL_MAP_ENTITE<MG_FACE*> plan_yz_x1;
860 TPL_MAP_ENTITE<MG_FACE*> plan_xz_y0;
861 TPL_MAP_ENTITE<MG_FACE*> plan_xz_y1;
862 std::map<unsigned long,MG_FACE*,std::less<unsigned long>>::iterator it_face;
863 for(MG_FACE *face = m_mg_geometrie->get_premier_face(it_face);face!=NULL;face=m_mg_geometrie->get_suivant_face(it_face))
864 {
865 double xyzmin[3];
866 double xyzmax[3];
867 face->get_xyz_min_max(xyzmin,xyzmax);
868
869 if(OPERATEUR::egal(xyzmin[0],boite3D_ves.get_xmin(),eps) && OPERATEUR::egal(xyzmax[0],boite3D_ves.get_xmin(),eps)) plan_yz_x0.ajouter(face);
870 else if(OPERATEUR::egal(xyzmin[0],boite3D_ves.get_xmax(),eps) && OPERATEUR::egal(xyzmax[0],boite3D_ves.get_xmax(),eps)) plan_yz_x1.ajouter(face);
871 else if(OPERATEUR::egal(xyzmin[1],boite3D_ves.get_ymin(),eps) && OPERATEUR::egal(xyzmax[1],boite3D_ves.get_ymin(),eps)) plan_xz_y0.ajouter(face);
872 else if(OPERATEUR::egal(xyzmin[1],boite3D_ves.get_ymax(),eps) && OPERATEUR::egal(xyzmax[1],boite3D_ves.get_ymax(),eps)) plan_xz_y1.ajouter(face);
873 else if(OPERATEUR::egal(xyzmin[2],boite3D_ves.get_zmin(),eps) && OPERATEUR::egal(xyzmax[2],boite3D_ves.get_zmin(),eps)) plan_xy_z0.ajouter(face);
874 else if(OPERATEUR::egal(xyzmin[2],boite3D_ves.get_zmax(),eps) && OPERATEUR::egal(xyzmax[2],boite3D_ves.get_zmax(),eps)) plan_xy_z1.ajouter(face);
875 }
876 MG_SOMMET* sommet_origine;
877 MG_SOMMET* sommet_x1y0z0;
878 MG_SOMMET* sommet_x0y1z0;
879 MG_SOMMET* sommet_x0y0z1;
880 std::map<unsigned long,MG_SOMMET*,std::less<unsigned long>>::iterator it_sommet;
881 for(MG_SOMMET* som=m_mg_geometrie->get_premier_sommet(it_sommet);som!=NULL;som=m_mg_geometrie->get_suivant_sommet(it_sommet))
882 {
883 double xyz[3];
884 som->get_point()->evaluer(xyz);
885 if(OPERATEUR::egal(xyz[0],boite3D_ves.get_xmin(),eps) && OPERATEUR::egal(xyz[1],boite3D_ves.get_ymin(),eps) && OPERATEUR::egal(xyz[2],boite3D_ves.get_zmin(),eps)) sommet_origine=som;
886 else if(OPERATEUR::egal(xyz[0],boite3D_ves.get_xmax(),eps) && OPERATEUR::egal(xyz[1],boite3D_ves.get_ymin(),eps) && OPERATEUR::egal(xyz[2],boite3D_ves.get_zmin(),eps)) sommet_x1y0z0=som;
887 else if(OPERATEUR::egal(xyz[0],boite3D_ves.get_xmin(),eps) && OPERATEUR::egal(xyz[1],boite3D_ves.get_ymax(),eps) && OPERATEUR::egal(xyz[2],boite3D_ves.get_zmin(),eps)) sommet_x0y1z0=som;
888 else if(OPERATEUR::egal(xyz[0],boite3D_ves.get_xmin(),eps) && OPERATEUR::egal(xyz[1],boite3D_ves.get_ymin(),eps) && OPERATEUR::egal(xyz[2],boite3D_ves.get_zmax(),eps)) sommet_x0y0z1=som;
889 }
890 if(Type_etude==MSTRUCT::TYPE_ETUDE::MECANIQUE)
891 {
892 if(Type_Chargement==MSTRUCT::TYPE_CHARGEMENT::SPHERIQUE)
893 {
894 if(Type_CL==MSTRUCT::TYPE_CONDITIONS_LIMITES::DEFORMATION_HOMOGENE)
895 {
896 char chr_valeur_cl[1000];
897 sprintf(chr_valeur_cl,"%lf",Valeur_CL);
898 std::string str_valeur_cl = chr_valeur_cl;
899 std::string formule_Dx = str_valeur_cl+ "*X";
900 std::string formule_Dy = str_valeur_cl+ "*Y";
901 std::string formule_Dz = str_valeur_cl+ "*Z";
902 std::vector<std::string> liste_variable_formule_Dx;
903 std::vector<std::string> liste_variable_formule_Dy;
904 std::vector<std::string> liste_variable_formule_Dz;
905 liste_variable_formule_Dx.push_back((std::string)"X");
906 liste_variable_formule_Dy.push_back((std::string)"Y");
907 liste_variable_formule_Dz.push_back((std::string)"Z");
908 appliquer_conditions_limites_plan(&plan_xy_z0,(char*)"Dx",formule_Dx,liste_variable_formule_Dx,true);
909 appliquer_conditions_limites_plan(&plan_xy_z0,(char*)"Dy",formule_Dy,liste_variable_formule_Dy,true);
910 appliquer_conditions_limites_plan(&plan_xy_z0,(char*)"Dz",formule_Dz,liste_variable_formule_Dz,true);
911 appliquer_conditions_limites_plan(&plan_xy_z1,(char*)"Dx",formule_Dx,liste_variable_formule_Dx,true);
912 appliquer_conditions_limites_plan(&plan_xy_z1,(char*)"Dy",formule_Dy,liste_variable_formule_Dy,true);
913 appliquer_conditions_limites_plan(&plan_xy_z1,(char*)"Dz",formule_Dz,liste_variable_formule_Dz,true);
914 appliquer_conditions_limites_plan(&plan_yz_x0,(char*)"Dx",formule_Dx,liste_variable_formule_Dx,true);
915 appliquer_conditions_limites_plan(&plan_yz_x0,(char*)"Dy",formule_Dy,liste_variable_formule_Dy,true);
916 appliquer_conditions_limites_plan(&plan_yz_x0,(char*)"Dz",formule_Dz,liste_variable_formule_Dz,true);
917 appliquer_conditions_limites_plan(&plan_yz_x1,(char*)"Dx",formule_Dx,liste_variable_formule_Dx,true);
918 appliquer_conditions_limites_plan(&plan_yz_x1,(char*)"Dy",formule_Dy,liste_variable_formule_Dy,true);
919 appliquer_conditions_limites_plan(&plan_yz_x1,(char*)"Dz",formule_Dz,liste_variable_formule_Dz,true);
920 appliquer_conditions_limites_plan(&plan_xz_y0,(char*)"Dx",formule_Dx,liste_variable_formule_Dx,true);
921 appliquer_conditions_limites_plan(&plan_xz_y0,(char*)"Dy",formule_Dy,liste_variable_formule_Dy,true);
922 appliquer_conditions_limites_plan(&plan_xz_y0,(char*)"Dz",formule_Dz,liste_variable_formule_Dz,true);
923 appliquer_conditions_limites_plan(&plan_xz_y1,(char*)"Dx",formule_Dx,liste_variable_formule_Dx,true);
924 appliquer_conditions_limites_plan(&plan_xz_y1,(char*)"Dy",formule_Dy,liste_variable_formule_Dy,true);
925 appliquer_conditions_limites_plan(&plan_xz_y1,(char*)"Dz",formule_Dz,liste_variable_formule_Dz,true);
926
927
928
929
930
931
932
933
934 // appliquer_conditions_limites_plan(&plan_xy_z0,(char*)"Dz",0.0,true);
935 // appliquer_conditions_limites_plan(&plan_xy_z1,(char*)"Dz",Valeur_CL,true);
936 // appliquer_conditions_limites_plan(&plan_yz_x0,(char*)"Dx",0.0,true);
937 // appliquer_conditions_limites_plan(&plan_yz_x1,(char*)"Dx",Valeur_CL,true);
938 // appliquer_conditions_limites_plan(&plan_xz_y0,(char*)"Dy",0.0,true);
939 // appliquer_conditions_limites_plan(&plan_xz_y1,(char*)"Dy",Valeur_CL,true);
940
941 // appliquer_conditions_limites_plan(&plan_xy_z0,(char*)"Dz",0.0,true);
942 // appliquer_conditions_limites_plan(&plan_xy_z1,(char*)"Dz",Valeur_CL,true);
943 // appliquer_conditions_limites_plan(&plan_yz_x0,(char*)"Dx",0.0,true);
944 // appliquer_conditions_limites_plan(&plan_yz_x1,(char*)"Dx",-0.5*Valeur_CL,true);
945 // appliquer_conditions_limites_plan(&plan_xz_y0,(char*)"Dy",0.0,true);
946 // appliquer_conditions_limites_plan(&plan_xz_y1,(char*)"Dy",-0.5*Valeur_CL,true);
947 }
948 else if(Type_CL==MSTRUCT::TYPE_CONDITIONS_LIMITES::CONTRAINTE_HOMOGENE)
949 {
950 sommet_origine->ajouter_ccf((char*)"Dt",0.0);
951 sommet_x1y0z0->ajouter_ccf((char*)"Dy",0.0);
952 sommet_x1y0z0->ajouter_ccf((char*)"Dz",0.0);
953 sommet_x0y1z0->ajouter_ccf((char*)"Dz",0.0);
954 appliquer_conditions_limites_plan(&plan_xy_z0,(char*)"Pz",-Valeur_CL,false);
955 appliquer_conditions_limites_plan(&plan_xy_z1,(char*)"Pz",Valeur_CL,false);
956 appliquer_conditions_limites_plan(&plan_yz_x0,(char*)"Px",-Valeur_CL,false);
957 appliquer_conditions_limites_plan(&plan_yz_x1,(char*)"Px",Valeur_CL,false);
958 appliquer_conditions_limites_plan(&plan_xz_y0,(char*)"Py",-Valeur_CL,false);
959 appliquer_conditions_limites_plan(&plan_xz_y1,(char*)"Py",Valeur_CL,false);
960
961
962
963
964
965
966
967 // appliquer_conditions_limites_plan(&plan_xy_z0,(char*)"Dz",0.0,true);
968 // appliquer_conditions_limites_plan(&plan_xy_z1,(char*)"Pz",Valeur_CL,false);
969 // appliquer_conditions_limites_plan(&plan_yz_x0,(char*)"Dx",0.0,true);
970 // appliquer_conditions_limites_plan(&plan_yz_x1,(char*)"Px",Valeur_CL,false);
971 // appliquer_conditions_limites_plan(&plan_xz_y0,(char*)"Dy",0.0,true);
972 // appliquer_conditions_limites_plan(&plan_xz_y1,(char*)"Py",Valeur_CL,false);
973 }
974 }
975 else if(Type_Chargement==MSTRUCT::TYPE_CHARGEMENT::DEVIATORIQUE)
976 {
977 if(Type_CL==MSTRUCT::TYPE_CONDITIONS_LIMITES::DEFORMATION_HOMOGENE)
978 {
979 char chr_valeur_cl[1000];
980 sprintf(chr_valeur_cl,"%lf",Valeur_CL);
981 std::string str_valeur_cl = chr_valeur_cl;
982 std::string formule_Dx = str_valeur_cl+ "*(Y+Z)";
983 std::string formule_Dy = str_valeur_cl+ "*(X+Z)";
984 std::string formule_Dz = str_valeur_cl+ "*(X+Y)";
985 std::vector<std::string> liste_variable_formule_Dx;
986 std::vector<std::string> liste_variable_formule_Dy;
987 std::vector<std::string> liste_variable_formule_Dz;
988 liste_variable_formule_Dx.push_back((std::string)"Y");
989 liste_variable_formule_Dx.push_back((std::string)"Z");
990 liste_variable_formule_Dy.push_back((std::string)"X");
991 liste_variable_formule_Dy.push_back((std::string)"Z");
992 liste_variable_formule_Dz.push_back((std::string)"X");
993 liste_variable_formule_Dz.push_back((std::string)"Y");
994 appliquer_conditions_limites_plan(&plan_xy_z0,(char*)"Dx",formule_Dx,liste_variable_formule_Dx,true);
995 appliquer_conditions_limites_plan(&plan_xy_z0,(char*)"Dy",formule_Dy,liste_variable_formule_Dy,true);
996 appliquer_conditions_limites_plan(&plan_xy_z0,(char*)"Dz",formule_Dz,liste_variable_formule_Dz,true);
997 appliquer_conditions_limites_plan(&plan_xy_z1,(char*)"Dx",formule_Dx,liste_variable_formule_Dx,true);
998 appliquer_conditions_limites_plan(&plan_xy_z1,(char*)"Dy",formule_Dy,liste_variable_formule_Dy,true);
999 appliquer_conditions_limites_plan(&plan_xy_z1,(char*)"Dz",formule_Dz,liste_variable_formule_Dz,true);
1000 appliquer_conditions_limites_plan(&plan_yz_x0,(char*)"Dx",formule_Dx,liste_variable_formule_Dx,true);
1001 appliquer_conditions_limites_plan(&plan_yz_x0,(char*)"Dy",formule_Dy,liste_variable_formule_Dy,true);
1002 appliquer_conditions_limites_plan(&plan_yz_x0,(char*)"Dz",formule_Dz,liste_variable_formule_Dz,true);
1003 appliquer_conditions_limites_plan(&plan_yz_x1,(char*)"Dx",formule_Dx,liste_variable_formule_Dx,true);
1004 appliquer_conditions_limites_plan(&plan_yz_x1,(char*)"Dy",formule_Dy,liste_variable_formule_Dy,true);
1005 appliquer_conditions_limites_plan(&plan_yz_x1,(char*)"Dz",formule_Dz,liste_variable_formule_Dz,true);
1006 appliquer_conditions_limites_plan(&plan_xz_y0,(char*)"Dx",formule_Dx,liste_variable_formule_Dx,true);
1007 appliquer_conditions_limites_plan(&plan_xz_y0,(char*)"Dy",formule_Dy,liste_variable_formule_Dy,true);
1008 appliquer_conditions_limites_plan(&plan_xz_y0,(char*)"Dz",formule_Dz,liste_variable_formule_Dz,true);
1009 appliquer_conditions_limites_plan(&plan_xz_y1,(char*)"Dx",formule_Dx,liste_variable_formule_Dx,true);
1010 appliquer_conditions_limites_plan(&plan_xz_y1,(char*)"Dy",formule_Dy,liste_variable_formule_Dy,true);
1011 appliquer_conditions_limites_plan(&plan_xz_y1,(char*)"Dz",formule_Dz,liste_variable_formule_Dz,true);
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024 // char chr_valeur_cl[1000];
1025 // sprintf(chr_valeur_cl,"%lf",Valeur_CL);
1026 // std::string str_valeur_cl = chr_valeur_cl;
1027 // std::string formule_Dx = str_valeur_cl+ "*Y";
1028 // std::string formule_Dy = str_valeur_cl+ "*Z";
1029 // std::string formule_Dz = str_valeur_cl+ "*X";
1030 // std::vector<std::string> liste_variable_formule_Dx;
1031 // std::vector<std::string> liste_variable_formule_Dy;
1032 // std::vector<std::string> liste_variable_formule_Dz;
1033 // liste_variable_formule_Dx.push_back((std::string)"Y");
1034 // liste_variable_formule_Dy.push_back((std::string)"Z");
1035 // liste_variable_formule_Dz.push_back((std::string)"X");
1036 // appliquer_conditions_limites_plan(&plan_xy_z0,(char*)"Dx",formule_Dx,liste_variable_formule_Dx,true);
1037 // appliquer_conditions_limites_plan(&plan_xy_z0,(char*)"Dy",formule_Dy,liste_variable_formule_Dy,true);
1038 // appliquer_conditions_limites_plan(&plan_xy_z0,(char*)"Dz",formule_Dz,liste_variable_formule_Dz,true);
1039 // appliquer_conditions_limites_plan(&plan_xy_z1,(char*)"Dx",formule_Dx,liste_variable_formule_Dx,true);
1040 // appliquer_conditions_limites_plan(&plan_xy_z1,(char*)"Dy",formule_Dy,liste_variable_formule_Dy,true);
1041 // appliquer_conditions_limites_plan(&plan_xy_z1,(char*)"Dz",formule_Dz,liste_variable_formule_Dz,true);
1042 // appliquer_conditions_limites_plan(&plan_yz_x0,(char*)"Dx",formule_Dx,liste_variable_formule_Dx,true);
1043 // appliquer_conditions_limites_plan(&plan_yz_x0,(char*)"Dy",formule_Dy,liste_variable_formule_Dy,true);
1044 // appliquer_conditions_limites_plan(&plan_yz_x0,(char*)"Dz",formule_Dz,liste_variable_formule_Dz,true);
1045 // appliquer_conditions_limites_plan(&plan_yz_x1,(char*)"Dx",formule_Dx,liste_variable_formule_Dx,true);
1046 // appliquer_conditions_limites_plan(&plan_yz_x1,(char*)"Dy",formule_Dy,liste_variable_formule_Dy,true);
1047 // appliquer_conditions_limites_plan(&plan_yz_x1,(char*)"Dz",formule_Dz,liste_variable_formule_Dz,true);
1048 // appliquer_conditions_limites_plan(&plan_xz_y0,(char*)"Dx",formule_Dx,liste_variable_formule_Dx,true);
1049 // appliquer_conditions_limites_plan(&plan_xz_y0,(char*)"Dy",formule_Dy,liste_variable_formule_Dy,true);
1050 // appliquer_conditions_limites_plan(&plan_xz_y0,(char*)"Dz",formule_Dz,liste_variable_formule_Dz,true);
1051 // appliquer_conditions_limites_plan(&plan_xz_y1,(char*)"Dx",formule_Dx,liste_variable_formule_Dx,true);
1052 // appliquer_conditions_limites_plan(&plan_xz_y1,(char*)"Dy",formule_Dy,liste_variable_formule_Dy,true);
1053 // appliquer_conditions_limites_plan(&plan_xz_y1,(char*)"Dz",formule_Dz,liste_variable_formule_Dz,true);
1054 }
1055 else if(Type_CL==MSTRUCT::TYPE_CONDITIONS_LIMITES::CONTRAINTE_HOMOGENE)
1056 {
1057 sommet_origine->ajouter_ccf((char*)"Dt",0.0);
1058 sommet_x1y0z0->ajouter_ccf((char*)"Dy",0.0);
1059 sommet_x1y0z0->ajouter_ccf((char*)"Dz",0.0);
1060 sommet_x0y1z0->ajouter_ccf((char*)"Dz",0.0);
1061 appliquer_conditions_limites_plan(&plan_xy_z0,(char*)"Px",-Valeur_CL,false);
1062 appliquer_conditions_limites_plan(&plan_xy_z0,(char*)"Py",-Valeur_CL,false);
1063 appliquer_conditions_limites_plan(&plan_xy_z0,(char*)"Pz",0.0,false);
1064 appliquer_conditions_limites_plan(&plan_xy_z1,(char*)"Px",Valeur_CL,false);
1065 appliquer_conditions_limites_plan(&plan_xy_z1,(char*)"Py",Valeur_CL,false);
1066 appliquer_conditions_limites_plan(&plan_xy_z1,(char*)"Pz",0.0,false);
1067 appliquer_conditions_limites_plan(&plan_xz_y0,(char*)"Px",-Valeur_CL,false);
1068 appliquer_conditions_limites_plan(&plan_xz_y0,(char*)"Py",0.0,false);
1069 appliquer_conditions_limites_plan(&plan_xz_y0,(char*)"Pz",-Valeur_CL,false);
1070 appliquer_conditions_limites_plan(&plan_xz_y1,(char*)"Px",Valeur_CL,false);
1071 appliquer_conditions_limites_plan(&plan_xz_y1,(char*)"Py",0.0,false);
1072 appliquer_conditions_limites_plan(&plan_xz_y1,(char*)"Pz",Valeur_CL,false);
1073 appliquer_conditions_limites_plan(&plan_yz_x0,(char*)"Px",0.0,false);
1074 appliquer_conditions_limites_plan(&plan_yz_x0,(char*)"Py",-Valeur_CL,false);
1075 appliquer_conditions_limites_plan(&plan_yz_x0,(char*)"Pz",-Valeur_CL,false);
1076 appliquer_conditions_limites_plan(&plan_yz_x1,(char*)"Px",0.0,false);
1077 appliquer_conditions_limites_plan(&plan_yz_x1,(char*)"Py",Valeur_CL,false);
1078 appliquer_conditions_limites_plan(&plan_yz_x1,(char*)"Pz",Valeur_CL,false);
1079 }
1080 }
1081 }
1082 else if(Type_etude==MSTRUCT::TYPE_ETUDE::THERMIQUE)
1083 {
1084 if(Type_CL==MSTRUCT::TYPE_CONDITIONS_LIMITES::GRADIENT_TEMPERATURE)
1085 {
1086 if(Direction==0)
1087 {
1088 appliquer_conditions_limites_plan(&plan_yz_x0,(char*)"Tn",0.0,false);
1089 appliquer_conditions_limites_plan(&plan_yz_x1,(char*)"Tn",Valeur_CL,false);
1090 appliquer_conditions_limites_plan(&plan_xy_z0,(char*)"fn",0.0,false);
1091 appliquer_conditions_limites_plan(&plan_xy_z1,(char*)"fn",0.0,false);
1092 appliquer_conditions_limites_plan(&plan_xz_y0,(char*)"fn",0.0,false);
1093 appliquer_conditions_limites_plan(&plan_xz_y1,(char*)"fn",0.0,false);
1094 }
1095 else if(Direction==1)
1096 {
1097 appliquer_conditions_limites_plan(&plan_yz_x0,(char*)"fn",0.0,false);
1098 appliquer_conditions_limites_plan(&plan_yz_x1,(char*)"fn",0.0,false);
1099 appliquer_conditions_limites_plan(&plan_xy_z0,(char*)"fn",0.0,false);
1100 appliquer_conditions_limites_plan(&plan_xy_z1,(char*)"fn",0.0,false);
1101 appliquer_conditions_limites_plan(&plan_xz_y0,(char*)"Tn",0.0,false);
1102 appliquer_conditions_limites_plan(&plan_xz_y1,(char*)"Tn",Valeur_CL,false);
1103 }
1104 else if(Direction==2)
1105 {
1106 appliquer_conditions_limites_plan(&plan_yz_x0,(char*)"fn",0.0,false);
1107 appliquer_conditions_limites_plan(&plan_yz_x1,(char*)"fn",0.0,false);
1108 appliquer_conditions_limites_plan(&plan_xy_z0,(char*)"Tn",0.0,false);
1109 appliquer_conditions_limites_plan(&plan_xy_z1,(char*)"Tn",Valeur_CL,false);
1110 appliquer_conditions_limites_plan(&plan_xz_y0,(char*)"fn",0.0,false);
1111 appliquer_conditions_limites_plan(&plan_xz_y1,(char*)"fn",0.0,false);
1112 }
1113 }
1114 else if(Type_CL==MSTRUCT::TYPE_CONDITIONS_LIMITES::FLUX_CHALEUR)
1115 {
1116 if(Direction==0)
1117 {
1118 sommet_origine->ajouter_ccf((char*)"Tn",0.0);
1119 appliquer_conditions_limites_plan(&plan_yz_x0,(char*)"fn",Valeur_CL,false);
1120 appliquer_conditions_limites_plan(&plan_yz_x1,(char*)"fn",-Valeur_CL,false);
1121 appliquer_conditions_limites_plan(&plan_xy_z0,(char*)"fn",0.0,false);
1122 appliquer_conditions_limites_plan(&plan_xy_z1,(char*)"fn",0.0,false);
1123 appliquer_conditions_limites_plan(&plan_xz_y0,(char*)"fn",0.0,false);
1124 appliquer_conditions_limites_plan(&plan_xz_y1,(char*)"fn",0.0,false);
1125 }
1126 else if(Direction==1)
1127 {
1128 sommet_origine->ajouter_ccf((char*)"Tn",0.0);
1129 appliquer_conditions_limites_plan(&plan_yz_x0,(char*)"fn",0.0,false);
1130 appliquer_conditions_limites_plan(&plan_yz_x1,(char*)"fn",0.0,false);
1131 appliquer_conditions_limites_plan(&plan_xy_z0,(char*)"fn",0.0,false);
1132 appliquer_conditions_limites_plan(&plan_xy_z1,(char*)"fn",0.0,false);
1133 appliquer_conditions_limites_plan(&plan_xz_y0,(char*)"fn",Valeur_CL,false);
1134 appliquer_conditions_limites_plan(&plan_xz_y1,(char*)"fn",-Valeur_CL,false);
1135 }
1136 else if(Direction==2)
1137 {
1138 sommet_origine->ajouter_ccf((char*)"Tn",0.0);
1139 appliquer_conditions_limites_plan(&plan_yz_x0,(char*)"fn",0.0,false);
1140 appliquer_conditions_limites_plan(&plan_yz_x1,(char*)"fn",0.0,false);
1141 appliquer_conditions_limites_plan(&plan_xy_z0,(char*)"fn",Valeur_CL,false);
1142 appliquer_conditions_limites_plan(&plan_xy_z1,(char*)"fn",-Valeur_CL,false);
1143 appliquer_conditions_limites_plan(&plan_xz_y0,(char*)"fn",0.0,false);
1144 appliquer_conditions_limites_plan(&plan_xz_y1,(char*)"fn",0.0,false);
1145 }
1146 }
1147 }
1148 return 0;
1149
1150 }
1151
1152
1153
1154
1155
1156
1157