MAGiC  V5.0
Mailleurs Automatiques de Géometries intégrés à la Cao
fct_taille_fem_solution_generateur_echantillon_frontiere.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_echantillon_frontiere.cpp
15 //####//
16 //####//------------------------------------------------------------
17 //####//------------------------------------------------------------
18 //####// COPYRIGHT 2000-2024
19 //####// jeu 13 jun 2024 11:58:53 EDT
20 //####//------------------------------------------------------------
21 //####//------------------------------------------------------------
22 
23 #include "gestionversion.h"
24 #include <math.h>
26 #include "tpl_grille.h"
27 
28 
29 
31 (MG_GESTIONNAIRE *gesttmp,MG_GEOMETRIE* geotmp,double dg,int fechantillon,int nxtmp,
32  int nytmp,int nztmp,char *nomsolution,double eps,double ind1,double ind2,double *lst_pt_ctrl,int nbpt):
33  FCT_TAILLE_FEM_SOLUTION_ECHANTILLONNAGE_ESTIMATION(gesttmp, geotmp, dg,fechantillon,nxtmp,
34 nytmp, nztmp, nomsolution, ind1, ind2),epsilon(eps),point_controle(lst_pt_ctrl),nb_pt_ctrl(nbpt)
35 {
36 
37 }
38 
42 {
43 
44 }
46 {
49  delete PT;
50 }
52 {
53  double xmin=1e308,ymin=1e308,zmin=1e308,xmax=-1e308,ymax=-1e308,zmax=-1e308;
54  int nb_face=geo->get_nb_mg_face();
56  for (int j=0;j<nb_face;j++)
57  {
58  MG_FACE* face=geo->get_mg_face(j);
59  CT_FACE* cface=new CT_FACE(face);
60  cface->change_umax(-1e308);
61  cface->change_umin(1e308);
62  cface->change_vmax(-1e308);
63  cface->change_vmin(1e308);
64  lstface.ajouter(cface);
65  }
66  int nb_arete=geo->get_nb_mg_arete();
67  for (int j=0;j<nb_arete;j++)
68  {
69  MG_ARETE* arete=geo->get_mg_arete(j);
70  std::vector<MG_FACE*> vector_mgface;
71  for(int k=0;k<arete->get_nb_mg_coarete();k++)
72  {
73  if(geo->get_mg_coareteid(arete->get_mg_coarete(k)->get_id())!=NULL)
74  {
75  MG_FACE* mg_face = arete->get_mg_coarete(k)->get_boucle()->get_mg_face();
76  if(geo->get_mg_faceid(mg_face->get_id())!=NULL) vector_mgface.push_back(mg_face);
77  }
78  }
79  int nbfac = vector_mgface.size();
80  double tmin=arete->get_tmin();
81  double tmax=arete->get_tmax();
82  double tdemi=0.5*(tmax+tmin);
83  double xyz1[3],xyz2[3];
84  arete->evaluer(tmin,xyz1);
85  arete->evaluer(tdemi,xyz2);
86  OT_VECTEUR_3D vec(xyz1,xyz2);
87  double densdep=vec.get_longueur()*2.;
88  for (int k=0;k<fechan+1;k++)
89  {
90  double t=tmin+1.0*k/fechan*(tmax-tmin);
91  double xyz[3];
92  arete->evaluer(t,xyz);
93  if (xyz[0]<xmin) xmin=xyz[0];
94  if (xyz[0]>xmax) xmax=xyz[0];
95  if (xyz[1]<ymin) ymin=xyz[1];
96  if (xyz[1]>ymax) ymax=xyz[1];
97  if (xyz[2]<zmin) zmin=xyz[2];
98  if (xyz[2]>zmax) zmax=xyz[2];
99  double courbure=arete->get_M(t);
100  for (int l=0;l<nbfac;l++)
101  {
102  double uv[2];
103  vector_mgface[l]->inverser(uv,xyz);
104  CT_FACE* fac=lstface.getid(vector_mgface[l]->get_id());
105 
106  if (uv[0]>fac->get_umax()) fac->change_umax(uv[0]);
107  if (uv[0]<fac->get_umin()) fac->change_umin(uv[0]);
108  if (uv[1]>fac->get_vmax()) fac->change_vmax(uv[1]);
109  if (uv[1]<fac->get_vmin()) fac->change_vmin(uv[1]);
110  double cmin,cmax;
111  vector_mgface[l]->get_courbure(uv,cmax,cmin);
112  cmax=fabs(cmax);
113  if (cmax>courbure) courbure=cmax;
114  }
115  double dn=densdep;
116  if (!(OPERATEUR::egal(courbure,0.0,1e-8)))
117  dn=sqrt(8*epsilon/courbure);
118  else
119  dn=ecart_nodal;
120  if (dn>ecart_nodal)
121  dn=ecart_nodal;
122  if (densdep<dn)
123  dn=densdep;
124  double dist=zonezoom*(ecart_nodal-dn);
125  if (!(OPERATEUR::egal(dist,0.0,1e-8)))
126  {
127  BOITE_3D boite(xyz[0]-dist,xyz[1]-dist,xyz[2]-dist,xyz[0]+dist,xyz[1]+dist,xyz[2]+dist);
128  double ecart=dn;
129  CT_POINT_ECHANTILLONNAGE* pt=new CT_POINT_ECHANTILLONNAGE(xyz[0],xyz[1],xyz[2],ecart,boite);
130  lstpoint.ajouter(pt);
131  }
132 
133  }
134  }
135  for (int j=0;j<nb_face;j++)
136  {
137  MG_FACE* face=geo->get_mg_face(j);
138  CT_FACE* cface=lstface.getid(face->get_id());
139  double umin=cface->get_umin();
140  double vmin=cface->get_vmin();
141  double umax=cface->get_umax();
142  double vmax=cface->get_vmax();
143  if(face->get_surface()->est_periodique_u())
144  {
145  umin=0;
146  umax=face->get_surface()->get_periode_u();
147  }
148  if(face->get_surface()->est_periodique_v())
149  {
150  vmin=0;
151  vmax=face->get_surface()->get_periode_v();
152  }
153  for (int k=0;k<fechan+1;k++)
154  for (int l=0;l<fechan+1;l++)
155  {
156  double uv[2];
157  uv[0]=umin+1.0*k/fechan*(umax-umin);
158  uv[1]=vmin+1.0*l/fechan*(vmax-vmin);
159  double xyz[3];
160  face->evaluer(uv,xyz);
161  if (xyz[0]<xmin) xmin=xyz[0];
162  if (xyz[1]<ymin) ymin=xyz[1];
163  if (xyz[2]<zmin) zmin=xyz[2];
164  if (xyz[0]>xmax) xmax=xyz[0];
165  if (xyz[1]>ymax) ymax=xyz[1];
166  if (xyz[2]>zmax) zmax=xyz[2];
167  double cmax,cmin;
168  face->get_courbure(uv,cmax,cmin);
169  cmax=fabs(cmax);
170  double dn;
171  if (!(OPERATEUR::egal(cmax,0.0,1e-8)))
172  dn=sqrt(8*epsilon/cmax);
173  else dn=ecart_nodal;
174  if (dn>ecart_nodal)
175  dn=ecart_nodal;
176  double dist=zonezoom*(ecart_nodal-dn);
177  if (!(OPERATEUR::egal(dist,0.0,1e-8)))
178  {
179  BOITE_3D boite(xyz[0]-dist,xyz[1]-dist,xyz[2]-dist,xyz[0]+dist,xyz[1]+dist,xyz[2]+dist);
180  double ecart=dn;
181  CT_POINT_ECHANTILLONNAGE* pt=new CT_POINT_ECHANTILLONNAGE(xyz[0],xyz[1],xyz[2],ecart,boite);
182  lstpoint.ajouter(pt);
183  }
184 
185 
186  }
187 
188  }
189  char message[500];
190  int nbptech=lstpoint.get_nb();
191  sprintf(message," Nombre de points d'échantillonage sur les entites %d",nbptech);
192  affiche(message);
193  //insertion des points de controles
194  for (int i=0;i<nb_pt_ctrl;i++)
195  {
196  double xyz[3];
197  xyz[0]=point_controle[4*i];
198  xyz[1]=point_controle[4*i+1];
199  xyz[2]=point_controle[4*i+2];
200  double dn=point_controle[4*i+3];
201  double dist=zonezoom*(ecart_nodal-dn);
202  BOITE_3D boite(xyz[0]-dist,xyz[1]-dist,xyz[2]-dist,xyz[0]+dist,xyz[1]+dist,xyz[2]+dist);
203  double ecart=dn;
204  CT_POINT_ECHANTILLONNAGE* pt=new CT_POINT_ECHANTILLONNAGE(xyz[0],xyz[1],xyz[2],ecart,boite);
205  lstpoint.ajouter(pt);
206  }
207  nbptech=lstpoint.get_nb()-nbptech;
208  sprintf(message," Nombre de points d'échantillonage depuis le fichier %d",nbptech);
209  affiche(message);
211  BOITE_3D boi(xmin,ymin,zmin,xmax,ymax,zmax);
213  xmin=boi.get_xmin();
214  ymin=boi.get_ymin();
215  zmin=boi.get_zmin();
216  xmax=boi.get_xmax();
217  ymax=boi.get_ymax();
218  zmax=boi.get_zmax();
219  int nbechan=lstpoint.get_nb();
220  int nx=pow(nbechan,0.33333333333333333)+1;
224  for(CT_POINT_ECHANTILLONNAGE* PT=lstpoint.get_premier(it11);PT!=NULL;PT=lstpoint.get_suivant(it11))
225  {
226  double xyz[3];
227  PT->evaluer(xyz);
228  double ecart=PT->get_valeur();
229  BOITE_3D boite(xyz[0],xyz[1],xyz[2],xyz[0],xyz[1],xyz[2]);
230  TPL_CELLULE_GRILLE<CT_POINT_ECHANTILLONNAGE*> *cell=grille.get_cellule(xyz[0],xyz[1],xyz[2]);
231  int trouve=0;
232  for (int j=0;j<cell->get_nb_entite();j++)
233  {
235  double xyz2[3];
236  pt->evaluer(xyz2);
237  OT_VECTEUR_3D vec(xyz,xyz2);
238  if (vec.get_longueur()<1e-10*boite_englobante.get_rayon())
239  {
240  if (PT->get_valeur()<pt->get_valeur()) pt->change_valeur(PT->get_valeur());
241  PT->change_etat(false);
242  trouve=1;
243  }
244  }
245  if (trouve==0)
246  {
247  CT_POINT_ECHANTILLONNAGE* pt=new CT_POINT_ECHANTILLONNAGE(xyz[0],xyz[1],xyz[2],ecart,boite);
248  lstpoint2.ajouter(pt);
249  grille.inserer(pt);
250  }
251  }
252 
253 
254 
255 
256 
257 
258  octre.initialiser(&lstpoint2,1,xmin,ymin,zmin,xmax, ymax, zmax);
259  for(CT_POINT_ECHANTILLONNAGE* PT=lstpoint2.get_premier(it11);PT!=NULL;PT=lstpoint2.get_suivant(it11))
260  delete PT;
261  int nb_point=lstpoint.get_nb();
262  for(CT_POINT_ECHANTILLONNAGE* PT=lstpoint.get_premier(it11);PT!=NULL;PT=lstpoint.get_suivant(it11))
263  if (PT->get_etat()==true) octre.inserer(PT);
264 
265 
266 
267 }
FCT_TAILLE_FEM_SOLUTION_GENERATEUR_ECHANTILLON_FRONTIERE::lstface
TPL_MAP_ENTITE< CT_FACE * > lstface
Definition: fct_taille_fem_solution_generateur_echantillon_frontiere.h:43
TPL_CELLULE_GRILLE
Definition: tpl_grille.h:70
TPL_MAP_ENTITE::get_premier
virtual X get_premier(ITERATEUR &it)
Definition: tpl_map_entite.h:112
CT_FACE::get_umin
double get_umin(void)
Definition: ct_face.cpp:49
CT_FACE::change_umax
void change_umax(double val)
Definition: ct_face.cpp:65
FCT_TAILLE_FEM_SOLUTION::nx
int nx
Definition: fct_taille_fem_solution.h:77
gestionversion.h
MG_SURFACE::get_periode_u
virtual double get_periode_u(void)=0
MG_GEOMETRIE::get_mg_coareteid
MG_COARETE * get_mg_coareteid(long num)
Definition: mg_geometrie.cpp:1029
FCT_TAILLE_FEM_SOLUTION_GENERATEUR_ECHANTILLON_FRONTIERE::~FCT_TAILLE_FEM_SOLUTION_GENERATEUR_ECHANTILLON_FRONTIERE
~FCT_TAILLE_FEM_SOLUTION_GENERATEUR_ECHANTILLON_FRONTIERE()
Definition: fct_taille_fem_solution_generateur_echantillon_frontiere.cpp:45
TPL_CELLULE_GRILLE::get_nb_entite
int get_nb_entite(void)
Definition: tpl_grille.h:80
TPL_MAP_ENTITE
Definition: tpl_map_entite.h:35
MG_ARETE::evaluer
virtual void evaluer(double t, double *xyz)
Definition: mg_arete.cpp:143
BOITE_3D::get_xmin
double get_xmin(void)
Definition: ot_boite_3d.cpp:104
MG_IDENTIFICATEUR::get_id
unsigned long get_id()
Definition: mg_identificateur.cpp:53
TPL_GRILLE::inserer
virtual void inserer(A a)
Definition: tpl_grille.h:274
MG_GEOMETRIE::get_nb_mg_arete
unsigned int get_nb_mg_arete(void)
Definition: mg_geometrie.cpp:813
FCT_TAILLE_FEM_SOLUTION_GENERATEUR_ECHANTILLON_FRONTIERE::nb_pt_ctrl
int nb_pt_ctrl
Definition: fct_taille_fem_solution_generateur_echantillon_frontiere.h:45
robustPredicates::epsilon
static REAL epsilon
Definition: robustpredicates.cc:371
CT_POINT_ECHANTILLONNAGE::change_valeur
void change_valeur(double val)
Definition: ct_point_echantillonnage.cpp:75
FCT_TAILLE_FEM_SOLUTION_ECHANTILLONNAGE_ESTIMATION::lstpoint
TPL_MAP_ENTITE< CT_POINT_ECHANTILLONNAGE * > lstpoint
Definition: fct_taille_fem_solution_echantillonnage_estimation.h:46
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
TPL_GRILLE::get_cellule
virtual TPL_CELLULE_GRILLE< A > * get_cellule(int num)
Definition: tpl_grille.h:139
TPL_GRILLE
Definition: tpl_grille.h:121
MG_COARETE::get_boucle
virtual MG_BOUCLE * get_boucle(void)
Definition: mg_coarete.cpp:53
CT_POINT_ECHANTILLONNAGE::evaluer
virtual void evaluer(double *xyz)
Definition: ct_point_echantillonnage.cpp:45
CT_FACE::change_vmin
void change_vmin(double val)
Definition: ct_face.cpp:80
MG_GESTIONNAIRE
Definition: mg_gestionnaire.h:57
TPL_CELLULE_GRILLE::get_entite
A get_entite(int num)
Definition: tpl_grille.h:84
MG_ARETE::get_tmin
virtual double get_tmin(void)
Definition: mg_arete.cpp:179
FCT_TAILLE_FEM_SOLUTION_GENERATEUR_ECHANTILLON_FRONTIERE::FCT_TAILLE_FEM_SOLUTION_GENERATEUR_ECHANTILLON_FRONTIERE
FCT_TAILLE_FEM_SOLUTION_GENERATEUR_ECHANTILLON_FRONTIERE(MG_GESTIONNAIRE *gesttmp, MG_GEOMETRIE *geotmp, double dg, int fechantillon, int nxtmp, int nytmp, int nztmp, char *nomsolution, double eps, double ind1=4, double ind2=0.25, double *lst_pt_ctrl=NULL, int nbpt=0)
Definition: fct_taille_fem_solution_generateur_echantillon_frontiere.cpp:31
CT_FACE::change_umin
void change_umin(double val)
Definition: ct_face.cpp:75
TPL_OCTREE::inserer
virtual void inserer(BOITE_3D &boite, A a, TPL_CELLULE_OCTREE< A, CONDITION > *cellule)
Definition: tpl_octree.h:897
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
MG_ARETE::get_nb_mg_coarete
virtual int get_nb_mg_coarete(void)
Definition: mg_arete.cpp:106
MG_FACE::evaluer
virtual void evaluer(double *uv, double *xyz)
Definition: mg_face.cpp:192
fct_taille_fem_solution_generateur_echantillon_frontiere.h
FCT_TAILLE_FEM_SOLUTION_GENERATEUR_ECHANTILLON_FRONTIERE::point_controle
double * point_controle
Definition: fct_taille_fem_solution_generateur_echantillon_frontiere.h:44
CT_POINT_ECHANTILLONNAGE
Definition: ct_point_echantillonnage.h:28
BOITE_3D::get_xmax
double get_xmax(void)
Definition: ot_boite_3d.cpp:109
CT_FACE::change_vmax
void change_vmax(double val)
Definition: ct_face.cpp:70
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_GENERATEUR_ECHANTILLON_FRONTIERE::epsilon
double epsilon
Definition: fct_taille_fem_solution_generateur_echantillon_frontiere.h:41
FCT_TAILLE_FEM_SOLUTION_GENERATEUR_ISOTROPE::facteur_grossissement
double facteur_grossissement
Definition: fct_taille_fem_solution_generateur_isotrope.h:57
MG_GEOMETRIE::get_mg_arete
MG_ARETE * get_mg_arete(unsigned int num)
Definition: mg_geometrie.cpp:800
CT_FACE::get_umax
double get_umax(void)
Definition: ct_face.cpp:44
FCT_TAILLE_FEM_SOLUTION_GENERATEUR_ECHANTILLON_FRONTIERE::echantillonnage
void echantillonnage(void)
Definition: fct_taille_fem_solution_generateur_echantillon_frontiere.cpp:51
tpl_grille.h
CT_FACE
Definition: ct_face.h:29
MG_SURFACE::est_periodique_u
virtual int est_periodique_u(void)=0
MG_BOUCLE::get_mg_face
virtual MG_FACE * get_mg_face(void)
Definition: mg_boucle.cpp:102
FCT_TAILLE_FEM_SOLUTION_GENERATEUR_ECHANTILLON_FRONTIERE
Definition: fct_taille_fem_solution_generateur_echantillon_frontiere.h:30
FCT_TAILLE::affiche
void affiche(char *message)
Definition: fct_taille.cpp:446
MG_GEOMETRIE::get_mg_face
MG_FACE * get_mg_face(unsigned int num)
Definition: mg_geometrie.cpp:1251
BOITE_3D::get_ymax
double get_ymax(void)
Definition: ot_boite_3d.cpp:119
MG_ARETE::get_M
virtual double get_M(double t)
Definition: mg_arete.cpp:205
FCT_TAILLE_FEM_SOLUTION_GENERATEUR_ISOTROPE::ecart_nodal
double ecart_nodal
Definition: fct_taille_fem_solution_generateur_isotrope.h:53
MG_GEOMETRIE::get_nb_mg_face
unsigned int get_nb_mg_face(void)
Definition: mg_geometrie.cpp:1264
OT_VECTEUR_3D
Definition: ot_mathematique.h:94
TPL_MAP_ENTITE::ajouter
virtual void ajouter(X x)
Definition: tpl_map_entite.h:55
FCT_TAILLE_FEM_SOLUTION::boite_englobante
BOITE_3D boite_englobante
Definition: fct_taille_fem_solution.h:76
FCT_TAILLE_FEM_SOLUTION_GENERATEUR_ISOTROPE::geo
MG_GEOMETRIE * geo
Definition: fct_taille_fem_solution_generateur_isotrope.h:52
TPL_MAP_ENTITE::getid
virtual X getid(unsigned long num)
Definition: tpl_map_entite.h:96
BOITE_3D
Definition: ot_boite_3d.h:27
BOITE_3D::get_rayon
double get_rayon(void)
Definition: ot_boite_3d.cpp:144
FCT_TAILLE_FEM_SOLUTION_ECHANTILLONNAGE_ESTIMATION
Definition: fct_taille_fem_solution_echantillonnage_estimation.h:31
MG_SURFACE::est_periodique_v
virtual int est_periodique_v(void)=0
sqrt
double2 sqrt(double2 &val)
Definition: ot_doubleprecision.cpp:345
MG_SURFACE::get_periode_v
virtual double get_periode_v(void)=0
CT_FACE::get_vmax
double get_vmax(void)
Definition: ct_face.cpp:54
MG_GEOMETRIE::get_mg_faceid
MG_FACE * get_mg_faceid(unsigned long num)
Definition: mg_geometrie.cpp:1226
BOITE_3D::get_zmin
double get_zmin(void)
Definition: ot_boite_3d.cpp:124
MG_GEOMETRIE
Definition: mg_geometrie.h:84
OT_VECTEUR_3D::get_longueur
virtual double get_longueur(void) const
Definition: ot_mathematique.cpp:483
MG_FACE::get_courbure
virtual void get_courbure(double *uv, double &cmax, double &cmin)
Definition: mg_face.cpp:313
FCT_TAILLE_FEM_SOLUTION::ny
int ny
Definition: fct_taille_fem_solution.h:77
CT_FACE::get_vmin
double get_vmin(void)
Definition: ct_face.cpp:59
MG_ARETE
Definition: mg_arete.h:36
MG_FACE
Definition: mg_face.h:34
BOITE_3D::change_grosseur
void change_grosseur(double f)
Definition: ot_boite_3d.cpp:176
TPL_MAP_ENTITE::get_suivant
virtual X get_suivant(ITERATEUR &it)
Definition: tpl_map_entite.h:120
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_GENERATEUR_ISOTROPE::fechan
int fechan
Definition: fct_taille_fem_solution_generateur_isotrope.h:54
TPL_OCTREE::initialiser
virtual void initialiser(TPL_LISTE_ENTITE< CONDITION > *lst_entite, int nombre, double xmin, double ymin, double zmin, double xmax, double ymax, double zmax)
Definition: tpl_octree.h:366
MG_ARETE::get_tmax
virtual double get_tmax(void)
Definition: mg_arete.cpp:184
MG_FACE::get_surface
virtual MG_SURFACE * get_surface(void)
Definition: mg_face.cpp:109
MG_ARETE::get_mg_coarete
virtual MG_COARETE * get_mg_coarete(int num)
Definition: mg_arete.cpp:228