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 
double get_xmin(void)
double get_zmin(void)
double get_zmax(void)
double get_xmax(void)
void get_centre(double *coo)
double get_ymax(void)
double get_ymin(void)
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)
virtual void evaluer(double *param, double *resultat)=0
void affiche(char *message)
Definition: fct_taille.cpp:446
virtual BOITE_3D & get_boite_3D(void)=0
virtual double get_solution(int num=0)
virtual void change_solution(double val, int num=0)
FEM_NOEUD * get_premier_noeud(LISTE_FEM_NOEUD::iterator &it)
FEM_ELEMENT3 * get_suivant_element3(LISTE_FEM_ELEMENT3::iterator &it)
FEM_NOEUD * get_suivant_noeud(LISTE_FEM_NOEUD::iterator &it)
FEM_ELEMENT3 * get_premier_element3(LISTE_FEM_ELEMENT3::iterator &it)
void ecrire(double val, int i, int j, int coord=0, int num_no=0)
virtual double get_longueur(void) const
TPL_LISTE_ENTITE< A > lst_entite_A
Definition: tpl_grille.h:79
A get_entite(int num)
Definition: tpl_grille.h:84
virtual TPL_CELLULE_GRILLE< A > * get_cellule(int num)
Definition: tpl_grille.h:139
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
virtual X get(int num)
virtual void ajouter(X x)
virtual int get_nb(void)
double2 sqrt(double2 &val)