MAGiC  V5.0
Mailleurs Automatiques de Géometries intégrés à la Cao
fct_taille_fem_solution_echantillonnage_estimation.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_echantillonnage_estimation.cpp
15 //####//
16 //####//------------------------------------------------------------
17 //####//------------------------------------------------------------
18 //####// COPYRIGHT 2000-2024
19 //####// jeu 13 jun 2024 11:58:52 EDT
20 //####//------------------------------------------------------------
21 //####//------------------------------------------------------------
22 #include "gestionversion.h"
23 #include <math.h>
25 #include "mg_gestionnaire.h"
26 #include "mailleur3d_structure.h"
27 
29 (MG_GESTIONNAIRE *gesttmp,MG_GEOMETRIE* geotmp,double dg,int fechantillon,int nxtmp,
30  int nytmp,int nztmp,char *nomsolution,double ind1,double ind2):
31  FCT_TAILLE_FEM_SOLUTION_GENERATEUR_ISOTROPE(gesttmp,geotmp,dg,fechantillon,nxtmp,nytmp,nztmp,nomsolution),
32  zonezoom(ind1),zonetrans(ind2)
33 {
34 
35 }
36 
39 zonetrans(mdd.zonetrans),zonezoom(mdd.zonezoom)
40 {
41 
42 }
43 
45 {
46 }
47 
48 
49 
51 {
53  estimation();
54 }
55 
56 
58 {
59  int i=0;
60  LISTE_FEM_NOEUD::iterator it;
61 for (FEM_NOEUD* nod=fem->get_premier_noeud(it);nod!=NULL;nod=fem->get_suivant_noeud(it))
62  {
63  double x= nod->get_x() ;
64  double y= nod->get_y() ;
65  double z= nod->get_z() ;
66  double ecartt= estimer(x,y,z);
67  // cout<<ecartt<<endl;
68  sol->ecrire(1./ecartt/ecartt,i,0,0);
69  sol->ecrire(0.,i,0,1);
70  sol->ecrire(0.,i,0,2);
71  sol->ecrire(0.,i,0,3);
72  sol->ecrire(1./ecartt/ecartt,i,0,4);
73  sol->ecrire(0.,i,0,5);
74  sol->ecrire(0.,i,0,6);
75  sol->ecrire(0.,i,0,7);
76  sol->ecrire(1./ecartt/ecartt,i,0,8);
77  i++;
78  }
79 }
80 
82 
83 {
84 
86  //octre.rechercher(x,y,z,1e-10,lstpt);
87  octre.rechercher(x,y,z,0.,lstpt);
88  // cout<<"xmax "<<octre.get_boite_de_base().get_xmax()<<" ymax "<<octre.get_boite_de_base().get_ymax()<<" zmax "<<octre.get_boite_de_base().get_zmax()<<" xmin "<<octre.get_boite_de_base().get_xmin()<<" ymin "<<octre.get_boite_de_base().get_ymin()<<" zmin "<<octre.get_boite_de_base().get_zmin()<<endl;
89  //cout<<"x "<<x<<" y "<<y<<" z "<<z<<endl;
90 
91  /*int nbcel=octre.get_nb_cellule();
92  for (int j=0;j<nbcel;j++)
93  {
94  cout<<"octre.get_cellule()->get_boite().get_rayon()"<<octre.get_cellule(j)->get_boite().get_rayon()<<endl;
95  }*/
96  int nbpt=lstpt.get_nb(); //cout<<"nbpt "<<nbpt<<endl;
97  double rmin=1;
98  double nume=0.;
99  double deno=0.;
100  int nb_terme=0;
101  double delta=0.;
102  double F=0.;
103  double r=0.;
104  for (int i=0;i<nbpt;i++)
105  {
106  CT_POINT_ECHANTILLONNAGE* pt=lstpt.get(i);
107  BOITE_3D btpt(x,y,z,x,y,z);
108  if (pt->get_boite_3D()*btpt)
109  {
110 
111  double xyz[3];
112  pt->evaluer(xyz);
113  double dist=(x-xyz[0])*(x-xyz[0])+(y-xyz[1])*(y-xyz[1])+(z-xyz[2])*(z-xyz[2]);
114  dist=sqrt(dist);
115  double dnn=pt->get_valeur();
116  if (OPERATEUR::egal(dist,0.,1e-10)) return dnn;
117  delta=0.5*(pt->get_boite_3D().get_xmax()-pt->get_boite_3D().get_xmin());
118  if (dist<delta)
119  {
120  r=dist/delta;
121  F=pt->get_fonction_influence(r);
122  nume=nume+dnn*F;
123  deno=deno+F;
124  nb_terme++;
125  if (r<rmin)
126  rmin=r;
127  }
128  }
129  }
130  if (nb_terme==0) return ecart_nodal ;
131 
132  F=rmin;
133  nume=nume+ecart_nodal*zonetrans*nb_terme*F;
134  deno=deno+zonetrans*nb_terme*F;
135  // cout<<nume/deno<<endl;
136  return nume/deno;
137 }
138 /*{
139  double xmin=1e308,ymin=1e308,zmin=1e308,
140  xmax=-1e308,ymax=-1e308,zmax=-1e308;
141  int nb_geo=gest->get_nb_mg_geometrie();double epsilon=0.2;
142  for (int i=0;i<nb_geo;i++)
143  {
144  MG_GEOMETRIE* mggeo=gest->get_mg_geometrie(i);
145  int nb_face=mggeo->get_nb_mg_face();
146  TPL_MAP_ENTITE<CT_FACE*> lstface;
147  for (int j=0;j<nb_face;j++)
148  {
149  MG_FACE* face=mggeo->get_mg_face(j);
150  CT_FACE* cface=new CT_FACE(face);
151  cface->change_umax(-1e308);
152  cface->change_umin(1e308);
153  cface->change_vmax(-1e308);
154  cface->change_vmin(1e308);
155  lstface.ajouter(cface);
156  }
157  int nb_arete=mggeo->get_nb_mg_arete();
158  for (int j=0;j<nb_arete;j++)
159  {
160  MG_ARETE* arete=mggeo->get_mg_arete(j);
161  int nbfac=arete->get_nb_mg_coarete();
162  double tmin=arete->get_tmin();
163  double tmax=arete->get_tmax();
164  double tdemi=0.5*(tmax+tmin);
165  double xyz1[3],xyz2[3];
166  arete->evaluer(tmin,xyz1);
167  arete->evaluer(tdemi,xyz2);
168  OT_VECTEUR_3D vec(xyz1,xyz2);
169  double densdep=vec.get_longueur()*2.;
170  MG_FACE** lstfac=new MG_FACE*[nbfac];
171  for (int k=0;k<nbfac;k++)
172  lstfac[k]=arete->get_mg_coarete(k)->get_boucle()->get_mg_face();
173  if (fechan!=-1)
174  for (int k=1;k<fechan;k++)
175  {
176  double t=tmin+1.0*k/fechan*(tmax-tmin);
177  double xyz[3];
178  arete->evaluer(t,xyz);
179  if (xyz[0]<xmin) xmin=xyz[0];
180  if (xyz[0]>xmax) xmax=xyz[0];
181  if (xyz[1]<ymin) ymin=xyz[1];
182  if (xyz[1]>ymax) ymax=xyz[1];
183  if (xyz[2]<zmin) zmin=xyz[2];
184  if (xyz[2]>zmax) zmax=xyz[2];
185  double courbure=arete->get_M(t);
186  for (int l=0;l<nbfac;l++)
187  {
188  double uv[2];
189  lstfac[l]->inverser(uv,xyz);
190  CT_FACE* fac=lstface.getid(lstfac[l]->get_id());
191  if (uv[0]>fac->get_umax()) fac->change_umax(uv[0]);
192  if (uv[0]<fac->get_umin()) fac->change_umin(uv[0]);
193  if (uv[1]>fac->get_vmax()) fac->change_vmax(uv[1]);
194  if (uv[1]<fac->get_vmin()) fac->change_vmin(uv[1]);
195  double cmin,cmax;
196  lstfac[l]->get_courbure(uv,cmax,cmin);
197  cmax=fabs(cmax);
198  if (cmax>courbure) courbure=cmax;
199  }
200  double dn=densdep;
201 
202  if (!(OPERATEUR::egal(courbure,0.0,1e-8)))
203  dn=sqrt(8*epsilon/courbure);
204  else
205  dn=ecart_nodal;
206  if (dn>ecart_nodal)
207  dn=ecart_nodal;
208  if (densdep<dn)
209  dn=densdep;
210  double dist=zonezoom*(ecart_nodal-dn);
211  if (!(OPERATEUR::egal(dist,0.0,1e-8)))
212  {
213  BOITE_3D boite(xyz[0]-dist,xyz[1]-dist,xyz[2]-dist,xyz[0]+dist,xyz[1]+dist,xyz[2]+dist);
214  double ecart=dn;
215  CT_POINT_ECHANTILLONNAGE* pt=new CT_POINT_ECHANTILLONNAGE(xyz[0],xyz[1],xyz[2],ecart,boite);
216  lstpoint.ajouter(pt);
217  }
218 
219  }
220 
221  }
222  for (int j=0;j<nb_face;j++)
223  {
224  MG_FACE* face=mggeo->get_mg_face(j);
225  CT_FACE* cface=lstface.getid(face->get_id());
226  double umin=cface->get_umin();
227  double vmin=cface->get_vmin();
228  double umax=cface->get_umax();
229  double vmax=cface->get_vmax();
230  if (fechan!=-1)
231  {
232  for (int k=1;k<fechan;k++)
233  for (int l=1;l<fechan;l++)
234  {
235  double uv[2];
236  uv[0]=umin+1.0*k/fechan*(umax-umin);
237  uv[1]=vmin+1.0*l/fechan*(vmax-vmin);
238  double xyz[3];
239  face->evaluer(uv,xyz);
240  if (xyz[0]<xmin) xmin=xyz[0];
241  if (xyz[1]<ymin) ymin=xyz[1];
242  if (xyz[2]<zmin) zmin=xyz[2];
243  if (xyz[0]>xmax) xmax=xyz[0];
244  if (xyz[1]>ymax) ymax=xyz[1];
245  if (xyz[2]>zmax) zmax=xyz[2];
246  double cmax,cmin;
247  face->get_courbure(uv,cmax,cmin);
248  cmax=fabs(cmax);
249  double dn;
250  if (!(OPERATEUR::egal(cmax,0.0,1e-8)))
251  dn=sqrt(8*epsilon/cmax);
252  else dn=ecart_nodal;
253  if (dn>ecart_nodal)
254  dn=ecart_nodal;
255  double dist=zonezoom*(ecart_nodal-dn);
256  if (!(OPERATEUR::egal(dist,0.0,1e-8)))
257  {
258  BOITE_3D boite(xyz[0]-dist,xyz[1]-dist,xyz[2]-dist,xyz[0]+dist,xyz[1]+dist,xyz[2]+dist);
259  double ecart=dn;
260  CT_POINT_ECHANTILLONNAGE* pt=new CT_POINT_ECHANTILLONNAGE(xyz[0],xyz[1],xyz[2],ecart,boite);
261  lstpoint.ajouter(pt);
262  }
263 
264  }
265 
266  }
267 
268  }
269  int nbpt=lstpoint.get_nb();
270  double rmin=1;
271  double nume=0.;
272  double deno=0.;
273  int nb_terme=0;
274  double delta=0.;
275  double F=0.;
276  double r=0.;
277  for (int i=0;i<nbpt;i++)
278  {
279  CT_POINT_ECHANTILLONNAGE* pt=lstpoint.get(i);
280  BOITE_3D btpt(x,y,z,x,y,z);
281  if (pt->get_boite_3D()*btpt)
282  {
283 
284  double xyz[3];
285  pt->evaluer(xyz);
286  double dist=(x-xyz[0])*(x-xyz[0])+(y-xyz[1])*(y-xyz[1])+(z-xyz[2])*(z-xyz[2]);
287  dist=sqrt(dist);
288  double dnn=pt->get_valeur();
289  if (OPERATEUR::egal(dist,0.,1e-10)) return dnn;
290  delta=0.5*(pt->get_boite_3D().get_xmax()-pt->get_boite_3D().get_xmin());
291  if (dist<delta)
292  {
293  r=dist/delta;
294  F=pt->get_fonction_influence(r);
295  nume=nume+dnn*F;
296  deno=deno+F;
297  nb_terme++;
298  if (r<rmin)
299  rmin=r;
300  }
301  }
302  }
303  if (nb_terme==0) return ecart_nodal ;
304 
305  F=rmin;
306  nume=nume+ecart_nodal*zonetrans*nb_terme*F;
307  deno=deno+zonetrans*nb_terme*F;
308  // cout<<nume/deno<<endl;
309  return nume/deno;
310 
311 }
312 }*/
gestionversion.h
FCT_TAILLE_FEM_SOLUTION_ECHANTILLONNAGE_ESTIMATION::FCT_TAILLE_FEM_SOLUTION_ECHANTILLONNAGE_ESTIMATION
FCT_TAILLE_FEM_SOLUTION_ECHANTILLONNAGE_ESTIMATION(MG_GESTIONNAIRE *gesttmp, MG_GEOMETRIE *geotmp, double dg, int fechantillon, int nxtmp, int nytmp, int nztmp, char *nomsolution, double ind1=4, double ind2=0.25)
Definition: fct_taille_fem_solution_echantillonnage_estimation.cpp:29
TPL_MAP_ENTITE< CT_POINT_ECHANTILLONNAGE * >
BOITE_3D::get_xmin
double get_xmin(void)
Definition: ot_boite_3d.cpp:104
FCT_TAILLE_FEM_SOLUTION_ECHANTILLONNAGE_ESTIMATION::zonetrans
double zonetrans
Definition: fct_taille_fem_solution_echantillonnage_estimation.h:45
mg_gestionnaire.h
FEM_SOLUTION::ecrire
void ecrire(double val, int i, int j, int coord=0, int num_no=0)
Definition: fem_solution.cpp:411
CT_POINT_ECHANTILLONNAGE::get_valeur
double get_valeur(void)
Definition: ct_point_echantillonnage.cpp:57
FCT_TAILLE_FEM_SOLUTION_ECHANTILLONNAGE_ESTIMATION::octre
TPL_OCTREE< CT_POINT_ECHANTILLONNAGE *, CT_POINT_ECHANTILLONNAGE * > octre
Definition: fct_taille_fem_solution_echantillonnage_estimation.h:47
FCT_TAILLE_FEM_SOLUTION::sol
FEM_SOLUTION * sol
Definition: fct_taille_fem_solution.h:69
FEM_MAILLAGE::get_premier_noeud
FEM_NOEUD * get_premier_noeud(LISTE_FEM_NOEUD::iterator &it)
Definition: fem_maillage.cpp:174
FCT_TAILLE_FEM_SOLUTION_ECHANTILLONNAGE_ESTIMATION::echantillonnage
virtual void echantillonnage(void)=0
CT_POINT_ECHANTILLONNAGE::evaluer
virtual void evaluer(double *xyz)
Definition: ct_point_echantillonnage.cpp:45
FCT_TAILLE_FEM_SOLUTION_GENERATEUR_ISOTROPE
Definition: fct_taille_fem_solution_generateur_isotrope.h:34
MG_GESTIONNAIRE
Definition: mg_gestionnaire.h:57
FCT_TAILLE_FEM_SOLUTION::fem
FEM_MAILLAGE * fem
Definition: fct_taille_fem_solution.h:71
CT_POINT_ECHANTILLONNAGE::get_fonction_influence
double get_fonction_influence(double r)
Definition: ct_point_echantillonnage.cpp:69
CT_POINT_ECHANTILLONNAGE
Definition: ct_point_echantillonnage.h:28
FCT_TAILLE_FEM_SOLUTION_ECHANTILLONNAGE_ESTIMATION::~FCT_TAILLE_FEM_SOLUTION_ECHANTILLONNAGE_ESTIMATION
~FCT_TAILLE_FEM_SOLUTION_ECHANTILLONNAGE_ESTIMATION()
Definition: fct_taille_fem_solution_echantillonnage_estimation.cpp:44
BOITE_3D::get_xmax
double get_xmax(void)
Definition: ot_boite_3d.cpp:109
OPERATEUR::egal
static int egal(double a, double b, double eps)
Definition: ot_mathematique.cpp:1629
TPL_MAP_ENTITE::get_nb
virtual int get_nb(void)
Definition: tpl_map_entite.h:83
FCT_TAILLE_FEM_SOLUTION_ECHANTILLONNAGE_ESTIMATION::zonezoom
double zonezoom
Definition: fct_taille_fem_solution_echantillonnage_estimation.h:44
fct_taille_fem_solution_echantillonnage_estimation.h
TPL_OCTREE::rechercher
virtual void rechercher(BOITE_3D &boite, TPL_MAP_ENTITE< A > &liste_entite_trouve, TPL_CELLULE_OCTREE< A, CONDITION > *cellule)
Definition: tpl_octree.h:606
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
CT_POINT_ECHANTILLONNAGE::get_boite_3D
virtual class BOITE_3D get_boite_3D(void)
Definition: ct_point_echantillonnage.cpp:63
mailleur3d_structure.h
BOITE_3D
Definition: ot_boite_3d.h:27
FCT_TAILLE_FEM_SOLUTION_ECHANTILLONNAGE_ESTIMATION::construit_particulier
void construit_particulier(void)
Definition: fct_taille_fem_solution_echantillonnage_estimation.cpp:50
FCT_TAILLE_FEM_SOLUTION_ECHANTILLONNAGE_ESTIMATION
Definition: fct_taille_fem_solution_echantillonnage_estimation.h:31
sqrt
double2 sqrt(double2 &val)
Definition: ot_doubleprecision.cpp:345
TPL_MAP_ENTITE::get
virtual X get(int num)
Definition: tpl_map_entite.h:89
MG_GEOMETRIE
Definition: mg_geometrie.h:84
FCT_TAILLE_FEM_SOLUTION_ECHANTILLONNAGE_ESTIMATION::estimation
virtual void estimation(void)
Definition: fct_taille_fem_solution_echantillonnage_estimation.cpp:57
FEM_MAILLAGE::get_suivant_noeud
FEM_NOEUD * get_suivant_noeud(LISTE_FEM_NOEUD::iterator &it)
Definition: fem_maillage.cpp:182
FCT_TAILLE_FEM_SOLUTION_ECHANTILLONNAGE_ESTIMATION::estimer
virtual double estimer(double x, double y, double z)
Definition: fct_taille_fem_solution_echantillonnage_estimation.cpp:81