MAGiC  V5.0
Mailleurs Automatiques de Géometries intégrés à la Cao
fct_taille_fem_solution_generateur_gradient.cpp
Aller à la documentation de ce fichier.
1 //####//------------------------------------------------------------
2 //####//------------------------------------------------------------
3 //####// MAGiC
4 //####// Jean Christophe Cuilliere et Vincent FRANCOIS
5 //####// Departement de Genie Mecanique - UQTR
6 //####//------------------------------------------------------------
7 //####// MAGIC est un projet de recherche de l equipe ERICCA
8 //####// du departement de genie mecanique de l Universite du Quebec a Trois Rivieres
9 //####// http://www.uqtr.ca/ericca
10 //####// http://www.uqtr.ca/
11 //####//------------------------------------------------------------
12 //####//------------------------------------------------------------
13 //####//
14 //####// fct_taille_fem_solution_generateur_gradient.cpp
15 //####//
16 //####//------------------------------------------------------------
17 //####//------------------------------------------------------------
18 //####// COPYRIGHT 2000-2024
19 //####// jeu 13 jun 2024 11:58:53 EDT
20 //####//------------------------------------------------------------
21 //####//------------------------------------------------------------
22 #include "gestionversion.h"
24 #include "ot_geometrie.h"
25 #include "tpl_grille.h"
26 
27  FCT_TAILLE_FEM_SOLUTION_GENERATEUR_GRADIENT::FCT_TAILLE_FEM_SOLUTION_GENERATEUR_GRADIENT(MG_GESTIONNAIRE *gesttmp, MG_GEOMETRIE* geotmp,double dg,int fechantillon,int nnx,int nny,int nnz,char *nomsolution,std::vector<double> lst,double gradient):FCT_TAILLE_FEM_SOLUTION_GENERATEUR_ISOTROPE(gesttmp,geotmp,dg,fechantillon,nnx,nny,nnz,nomsolution),gradientmax(gradient),lstraffine(lst)
28  {
29 
30  }
31 
32 FCT_TAILLE_FEM_SOLUTION_GENERATEUR_GRADIENT::FCT_TAILLE_FEM_SOLUTION_GENERATEUR_GRADIENT(MG_GESTIONNAIRE *gesttmp, MG_GEOMETRIE* geotmp,FCT_TAILLE* carte,int fechantillon,int nnx,int nny,int nnz,char *nomsolution,std::vector<double> lst,double gradient):FCT_TAILLE_FEM_SOLUTION_GENERATEUR_ISOTROPE(gesttmp,geotmp,carte,fechantillon,nnx,nny,nnz,nomsolution),gradientmax(gradient),lstraffine(lst)
33  {
34 
35  }
36 
37  FCT_TAILLE_FEM_SOLUTION_GENERATEUR_GRADIENT::FCT_TAILLE_FEM_SOLUTION_GENERATEUR_GRADIENT(MG_GESTIONNAIRE *gesttmp, MG_MAILLAGE* maitmp,double dg,int fechantillon,int nnx,int nny,int nnz,char *nomsolution,std::vector<double> lst,double gradient):FCT_TAILLE_FEM_SOLUTION_GENERATEUR_ISOTROPE(gesttmp,maitmp,dg,fechantillon,nnx,nny,nnz,nomsolution),gradientmax(gradient),lstraffine(lst)
38  {
39 
40  }
41 
42 FCT_TAILLE_FEM_SOLUTION_GENERATEUR_GRADIENT::FCT_TAILLE_FEM_SOLUTION_GENERATEUR_GRADIENT(MG_GESTIONNAIRE *gesttmp, MG_MAILLAGE* maitmp,FCT_TAILLE* carte,int fechantillon,int nnx,int nny,int nnz,char *nomsolution,std::vector<double> lst,double gradient):FCT_TAILLE_FEM_SOLUTION_GENERATEUR_ISOTROPE(gesttmp,maitmp,carte,fechantillon,nnx,nny,nnz,nomsolution),gradientmax(gradient),lstraffine(lst)
43  {
44 
45  }
46 
47 
49 {
50 }
51 
52 
53 
54 
55 
56 
58 {
59 }
60 
61 
62 
64 {
65 cree_grille();
66 affiche((char*)" Points a raffiner");
68 affiche((char*)" Lissage");
70 affiche((char*)" Extrapolation aux noeuds");
72 }
73 
75 {
76  LISTE_FEM_ELEMENT3::iterator it_ele3;
77  for(FEM_ELEMENT3* ele3=fem->get_premier_element3(it_ele3);ele3!=NULL;ele3=fem->get_suivant_element3(it_ele3))
78  if (carteini==NULL) ele3->change_solution(ecart_nodal);
79  else
80  {
81  double xyz[3];
82  ele3->get_boite_3D().get_centre(xyz);
83  double tab[9];
84  carteini->evaluer(xyz,tab);
85  double ecart=1./sqrt(tab[0]);
86  ele3->change_solution(ecart);
87  }
88  int nb=lstraffine.size();
89  for (int i=0;i<nb/4;i=i+1)
90  {
91  double x=lstraffine[4*i];
92  double y=lstraffine[4*i+1];
93  double z=lstraffine[4*i+2];
94  double val=lstraffine[4*i+3];
96  FEM_ELEMENT3* ele3=cell->get_entite(0);
97  double valcell=ele3->get_solution();
98  if (val<valcell)
99  {
100  ele3->change_solution(val);
101  std::pair<FEM_ELEMENT3*,FEM_ELEMENT3*> tmp(ele3,ele3);
102  m_map_fem_ele3.insert(tmp);
103  }
104  }
105 
106 
107  std::map<FEM_ELEMENT3*,FEM_ELEMENT3*>::iterator it_map_ele3;
108  for(it_map_ele3=m_map_fem_ele3.begin();it_map_ele3!=m_map_fem_ele3.end();it_map_ele3++)
109  {
110  FEM_ELEMENT3* ele3=it_map_ele3->second;
111  double val=ele3->get_solution();
112  std::pair<double,FEM_ELEMENT3*> tmp(val,ele3);
113  m_map_fem_classe.insert(tmp);
114  }
115 return 0;
116 }
117 
118 
119 
120 
121 
122 
123 
124 
126 {
127 
128  while(!m_map_fem_classe.empty())
129  {
130  FEM_ELEMENT3* ele3=m_map_fem_classe.begin()->second;
131  double val=ele3->get_solution();
132  double centre[3];
133  ele3->get_boite_3D().get_centre(centre);
134  double en_centre=ele3->get_solution(0);
135  TPL_CELLULE_GRILLE<FEM_ELEMENT3*> *tab_cell[26];
136  for(int i=0;i<26;i++)tab_cell[i]=NULL;
137 
138  tab_cell[0] = m_grille_ele3.get_cellule(centre[0]-pasx,centre[1]-pasy,centre[2]-pasz);
139  tab_cell[1] = m_grille_ele3.get_cellule(centre[0],centre[1]-pasy,centre[2]-pasz);
140  tab_cell[2] = m_grille_ele3.get_cellule(centre[0]+pasx,centre[1]-pasy,centre[2]-pasz);
141  tab_cell[3] = m_grille_ele3.get_cellule(centre[0]-pasx,centre[1],centre[2]-pasz);
142  tab_cell[4] = m_grille_ele3.get_cellule(centre[0],centre[1],centre[2]-pasz);
143  tab_cell[5] = m_grille_ele3.get_cellule(centre[0]+pasx,centre[1],centre[2]-pasz);
144  tab_cell[6] = m_grille_ele3.get_cellule(centre[0]-pasx,centre[1]+pasy,centre[2]-pasz);
145  tab_cell[7] = m_grille_ele3.get_cellule(centre[0],centre[1]+pasy,centre[2]-pasz);
146  tab_cell[8] = m_grille_ele3.get_cellule(centre[0]+pasx,centre[1]+pasy,centre[2]-pasz);
147 
148  tab_cell[9] = m_grille_ele3.get_cellule(centre[0]-pasx,centre[1]-pasy,centre[2]);
149  tab_cell[10] = m_grille_ele3.get_cellule(centre[0],centre[1]-pasy,centre[2]);
150  tab_cell[11] = m_grille_ele3.get_cellule(centre[0]+pasx,centre[1]-pasy,centre[2]);
151  tab_cell[12] = m_grille_ele3.get_cellule(centre[0]-pasx,centre[1],centre[2]);
152  tab_cell[13] = m_grille_ele3.get_cellule(centre[0]+pasx,centre[1],centre[2]);
153  tab_cell[14] = m_grille_ele3.get_cellule(centre[0]-pasx,centre[1]+pasy,centre[2]);
154  tab_cell[15] = m_grille_ele3.get_cellule(centre[0],centre[1]+pasy,centre[2]);
155  tab_cell[16] = m_grille_ele3.get_cellule(centre[0]+pasx,centre[1]+pasy,centre[2]);
156 
157  tab_cell[17] = m_grille_ele3.get_cellule(centre[0]-pasx,centre[1]-pasy,centre[2]+pasz);
158  tab_cell[18] = m_grille_ele3.get_cellule(centre[0],centre[1]-pasy,centre[2]+pasz);
159  tab_cell[19] = m_grille_ele3.get_cellule(centre[0]+pasx,centre[1]-pasy,centre[2]+pasz);
160  tab_cell[20] = m_grille_ele3.get_cellule(centre[0]-pasx,centre[1],centre[2]+pasz);
161  tab_cell[21] = m_grille_ele3.get_cellule(centre[0],centre[1],centre[2]+pasz);
162  tab_cell[22] = m_grille_ele3.get_cellule(centre[0]+pasx,centre[1],centre[2]+pasz);
163  tab_cell[23] = m_grille_ele3.get_cellule(centre[0]-pasx,centre[1]+pasy,centre[2]+pasz);
164  tab_cell[24] = m_grille_ele3.get_cellule(centre[0],centre[1]+pasy,centre[2]+pasz);
165  tab_cell[25] = m_grille_ele3.get_cellule(centre[0]+pasx,centre[1]+pasy,centre[2]+pasz);
166  for(int i=0;i<26;i++)
167  {
168  if(tab_cell[i]!=NULL)
169  if(tab_cell[i]->get_nb_entite()==1)
170  {
171  FEM_ELEMENT3* ele3_voisin = tab_cell[i]->get_entite(0);
172  double valvoisin=ele3_voisin->get_solution();
173  double centrevoisin[3];
174  ele3_voisin->get_boite_3D().get_centre(centrevoisin);
175  OT_VECTEUR_3D vec(centre,centrevoisin);
176  double valvoisinmax=val+gradientmax*vec.get_longueur();
177  if(valvoisinmax<valvoisin)
178  {
179  ele3_voisin->change_solution(valvoisinmax);
180  std::map<double,FEM_ELEMENT3*>::iterator j=m_map_fem_classe.lower_bound(valvoisin);
181  int ok=0;
182  if (j!=m_map_fem_classe.end())
183  while (ok==0)
184  {
185  if ((*j).first>valvoisin) ok=1;
186  if (ele3_voisin==(*j).second) {m_map_fem_classe.erase(j);ok=1;}
187  if (ok==0) j++;
188  }
189  std::pair<double,FEM_ELEMENT3*> tmp(valvoisinmax,ele3_voisin);
190  m_map_fem_classe.insert(tmp);
191  }
192  }
193  }
194  m_map_fem_classe.erase(m_map_fem_classe.begin());
195  }
196 }
197 
199 {
200  int i=0;
201  LISTE_FEM_NOEUD::iterator it_fem_nd;
202  for(FEM_NOEUD* femnd=fem->get_premier_noeud(it_fem_nd);femnd!=NULL;femnd=fem->get_suivant_noeud(it_fem_nd))
203  {
204  double ecart_nodal_noeud=0.0;
205  TPL_LISTE_ENTITE<FEM_ELEMENT3*> *liste_fem_element3;
206  liste_fem_element3 = femnd->get_lien_element3();
207  for(int i=0;i<liste_fem_element3->get_nb();i++)
208  {
209  ecart_nodal_noeud+=liste_fem_element3->get(i)->get_solution(0);
210  }
211  ecart_nodal_noeud=ecart_nodal_noeud/liste_fem_element3->get_nb();
212  /* femnd->change_solution(1.0/ecart_nodal_noeud/ecart_nodal_noeud,0);
213  femnd->change_solution(1.0/ecart_nodal_noeud/ecart_nodal_noeud,4);
214  femnd->change_solution(1.0/ecart_nodal_noeud/ecart_nodal_noeud,8);
215  femnd->change_solution(0.,1);
216  femnd->change_solution(0.,2);
217  femnd->change_solution(0.,3);
218  femnd->change_solution(0.,5);
219  femnd->change_solution(0.,6);
220  femnd->change_solution(0.,7);*/
221  sol->ecrire(1.0/ecart_nodal_noeud/ecart_nodal_noeud,i,0,0);
222  sol->ecrire(0.0,i,0,1);
223  sol->ecrire(0.0,i,0,2);
224  sol->ecrire(0.0,i,0,3);
225  sol->ecrire(1./ecart_nodal_noeud/ecart_nodal_noeud,i,0,4);
226  sol->ecrire(0.0,i,0,5);
227  sol->ecrire(0.0,i,0,6);
228  sol->ecrire(0.0,i,0,7);
229  sol->ecrire(1./ecart_nodal_noeud/ecart_nodal_noeud,i,0,8);
230  i++;
231 
232  }
233 }
234 
236 {
237  double xmin=boite_englobante.get_xmin();
238  double ymin=boite_englobante.get_ymin();
239  double zmin=boite_englobante.get_zmin();
240  double xmax=boite_englobante.get_xmax();
241  double ymax=boite_englobante.get_ymax();
242  double zmax=boite_englobante.get_zmax();
243 
245  ymin,
246  zmin,
247  xmax,
248  ymax,
249  zmax,
250  nx,ny,nz);
251  LISTE_FEM_ELEMENT3::iterator it_ele3;
252  for(FEM_ELEMENT3* ele3=fem->get_premier_element3(it_ele3);ele3!=NULL;ele3=fem->get_suivant_element3(it_ele3))
253  {
254  double centre[3];
255  ele3->get_boite_3D().get_centre(centre);
256  TPL_CELLULE_GRILLE<FEM_ELEMENT3*>* cellule = m_grille_ele3.get_cellule(centre[0],centre[1],centre[2]);
257  cellule->lst_entite_A.ajouter(ele3);
258  }
259 }
260 
261 
262 
263 
264 
265 
266 
267 
268 
269 
270 
271 
272 
273 
274 
275 
276 
277 
278 
279 
280 
281 
282 
283 
284 
285 
286 
287 
288 
289 
290 
TPL_CELLULE_GRILLE
Definition: tpl_grille.h:70
FCT_TAILLE_FEM_SOLUTION_GENERATEUR_GRADIENT::cree_grille
virtual void cree_grille(void)
Definition: fct_taille_fem_solution_generateur_gradient.cpp:235
FCT_TAILLE_FEM_SOLUTION_GENERATEUR_GRADIENT::extrapoler_solution_noeud
virtual void extrapoler_solution_noeud(void)
Definition: fct_taille_fem_solution_generateur_gradient.cpp:198
FCT_TAILLE_FEM_SOLUTION::nx
int nx
Definition: fct_taille_fem_solution.h:77
FEM_MAILLAGE::get_suivant_element3
FEM_ELEMENT3 * get_suivant_element3(LISTE_FEM_ELEMENT3::iterator &it)
Definition: fem_maillage.cpp:680
ot_geometrie.h
gestionversion.h
FCT_TAILLE_FEM_SOLUTION_GENERATEUR_ISOTROPE::carteini
FCT_TAILLE * carteini
Definition: fct_taille_fem_solution_generateur_isotrope.h:59
BOITE_3D::get_xmin
double get_xmin(void)
Definition: ot_boite_3d.cpp:104
FCT_TAILLE_FEM_SOLUTION_GENERATEUR_GRADIENT::lstraffine
std::vector< double > lstraffine
Definition: fct_taille_fem_solution_generateur_gradient.h:87
FEM_ELEMENT_MAILLAGE::change_solution
virtual void change_solution(double val, int num=0)
Definition: fem_element_maillage.cpp:107
FEM_SOLUTION::ecrire
void ecrire(double val, int i, int j, int coord=0, int num_no=0)
Definition: fem_solution.cpp:411
BOITE_3D::get_centre
void get_centre(double *coo)
Definition: ot_boite_3d.cpp:149
FCT_TAILLE_FEM_SOLUTION::sol
FEM_SOLUTION * sol
Definition: fct_taille_fem_solution.h:69
TPL_GRILLE::get_cellule
virtual TPL_CELLULE_GRILLE< A > * get_cellule(int num)
Definition: tpl_grille.h:139
FEM_ELEMENT3
Definition: fem_element3.h:34
FEM_MAILLAGE::get_premier_noeud
FEM_NOEUD * get_premier_noeud(LISTE_FEM_NOEUD::iterator &it)
Definition: fem_maillage.cpp:174
FCT_TAILLE
Definition: fct_taille.h:30
FCT_TAILLE_FEM_SOLUTION_GENERATEUR_ISOTROPE
Definition: fct_taille_fem_solution_generateur_isotrope.h:34
MG_GESTIONNAIRE
Definition: mg_gestionnaire.h:57
TPL_CELLULE_GRILLE::get_entite
A get_entite(int num)
Definition: tpl_grille.h:84
FCT_TAILLE_FEM_SOLUTION_GENERATEUR_GRADIENT::FCT_TAILLE_FEM_SOLUTION_GENERATEUR_GRADIENT
FCT_TAILLE_FEM_SOLUTION_GENERATEUR_GRADIENT(MG_GESTIONNAIRE *gesttmp, MG_GEOMETRIE *geotmp, double dg, int fechantillon, int nnx, int nny, int nnz, char *nomsolution, std::vector< double > lst, double gradient=0.25)
Definition: fct_taille_fem_solution_generateur_gradient.cpp:27
FCT_TAILLE_FEM_SOLUTION_GENERATEUR_GRADIENT::lisser_solution
virtual void lisser_solution(void)
Definition: fct_taille_fem_solution_generateur_gradient.cpp:125
FCT_TAILLE_FEM_SOLUTION::fem
FEM_MAILLAGE * fem
Definition: fct_taille_fem_solution.h:71
BOITE_3D::get_zmax
double get_zmax(void)
Definition: ot_boite_3d.cpp:129
BOITE_3D::get_ymin
double get_ymin(void)
Definition: ot_boite_3d.cpp:114
fct_taille_fem_solution_generateur_gradient.h
FEM_ELEMENT_MAILLAGE::get_solution
virtual double get_solution(int num=0)
Definition: fem_element_maillage.cpp:113
FCT_TAILLE_FEM_SOLUTION_GENERATEUR_GRADIENT::m_grille_ele3
TPL_GRILLE< FEM_ELEMENT3 * > m_grille_ele3
Definition: fct_taille_fem_solution_generateur_gradient.h:88
BOITE_3D::get_xmax
double get_xmax(void)
Definition: ot_boite_3d.cpp:109
tpl_grille.h
FCT_TAILLE_FEM_SOLUTION_GENERATEUR_GRADIENT::m_map_fem_classe
std::multimap< double, FEM_ELEMENT3 * > m_map_fem_classe
Definition: fct_taille_fem_solution_generateur_gradient.h:90
FCT_TAILLE_FEM_SOLUTION::pasz
double pasz
Definition: fct_taille_fem_solution.h:78
FCT_TAILLE::affiche
void affiche(char *message)
Definition: fct_taille.cpp:446
TPL_LISTE_ENTITE::get_nb
virtual int get_nb(void)
Definition: tpl_liste_entite.h:67
TPL_LISTE_ENTITE::get
virtual X get(int num)
Definition: tpl_liste_entite.h:72
BOITE_3D::get_ymax
double get_ymax(void)
Definition: ot_boite_3d.cpp:119
FEM_NOEUD
Definition: fem_noeud.h:35
FCT_TAILLE_FEM_SOLUTION_GENERATEUR_ISOTROPE::ecart_nodal
double ecart_nodal
Definition: fct_taille_fem_solution_generateur_isotrope.h:53
TPL_CELLULE_GRILLE::lst_entite_A
TPL_LISTE_ENTITE< A > lst_entite_A
Definition: tpl_grille.h:79
FCT_TAILLE_FEM_SOLUTION_GENERATEUR_GRADIENT::construit_particulier
virtual void construit_particulier(void)
Definition: fct_taille_fem_solution_generateur_gradient.cpp:63
OT_VECTEUR_3D
Definition: ot_mathematique.h:94
FCT_TAILLE_FEM_SOLUTION::boite_englobante
BOITE_3D boite_englobante
Definition: fct_taille_fem_solution.h:76
sqrt
double2 sqrt(double2 &val)
Definition: ot_doubleprecision.cpp:345
FCT_TAILLE_FEM_SOLUTION_GENERATEUR_GRADIENT::gradientmax
double gradientmax
Definition: fct_taille_fem_solution_generateur_gradient.h:86
FCT_TAILLE_FEM_SOLUTION::pasx
double pasx
Definition: fct_taille_fem_solution.h:78
FCT_TAILLE_FEM_SOLUTION_GENERATEUR_GRADIENT
Definition: fct_taille_fem_solution_generateur_gradient.h:28
BOITE_3D::get_zmin
double get_zmin(void)
Definition: ot_boite_3d.cpp:124
FCT_TAILLE_FEM_SOLUTION_GENERATEUR_GRADIENT::m_map_fem_ele3
std::map< FEM_ELEMENT3 *, FEM_ELEMENT3 * > m_map_fem_ele3
Definition: fct_taille_fem_solution_generateur_gradient.h:89
MG_GEOMETRIE
Definition: mg_geometrie.h:84
OT_VECTEUR_3D::get_longueur
virtual double get_longueur(void) const
Definition: ot_mathematique.cpp:483
MG_MAILLAGE
Definition: mg_maillage.h:62
FEM_MAILLAGE::get_suivant_noeud
FEM_NOEUD * get_suivant_noeud(LISTE_FEM_NOEUD::iterator &it)
Definition: fem_maillage.cpp:182
FCT_TAILLE_FEM_SOLUTION::ny
int ny
Definition: fct_taille_fem_solution.h:77
TPL_LISTE_ENTITE
Definition: tpl_liste_entite.h:32
FEM_ELEMENT3::get_boite_3D
virtual BOITE_3D & get_boite_3D(void)=0
FCT_TAILLE_FEM_SOLUTION_GENERATEUR_GRADIENT::~FCT_TAILLE_FEM_SOLUTION_GENERATEUR_GRADIENT
virtual ~FCT_TAILLE_FEM_SOLUTION_GENERATEUR_GRADIENT()
Definition: fct_taille_fem_solution_generateur_gradient.cpp:57
TPL_GRILLE::initialiser
virtual void initialiser(double xmin, double ymin, double zmin, double xmax, double ymax, double zmax, int nb_pasx, int nb_pasy, int nb_pasz)
Definition: tpl_grille.h:142
FCT_TAILLE_FEM_SOLUTION::nz
int nz
Definition: fct_taille_fem_solution.h:77
FCT_TAILLE_FEM_SOLUTION::pasy
double pasy
Definition: fct_taille_fem_solution.h:78
FCT_TAILLE::evaluer
virtual void evaluer(double *param, double *resultat)=0
FCT_TAILLE_FEM_SOLUTION_GENERATEUR_GRADIENT::echantillonnage
virtual int echantillonnage(void)
Definition: fct_taille_fem_solution_generateur_gradient.cpp:74
FEM_MAILLAGE::get_premier_element3
FEM_ELEMENT3 * get_premier_element3(LISTE_FEM_ELEMENT3::iterator &it)
Definition: fem_maillage.cpp:672