MAGiC  V5.0
Mailleurs Automatiques de Géometries intégrés à la Cao
fct_generateur_3d.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_generateur_3d.cpp
15 //####//
16 //####//------------------------------------------------------------
17 //####//------------------------------------------------------------
18 //####// COPYRIGHT 2000-2024
19 //####// jeu 13 jun 2024 11:58:52 EDT
20 //####//------------------------------------------------------------
21 //####//------------------------------------------------------------
22 
23 
24 #include "gestionversion.h"
25 
26 
27 #pragma hdrstop
28 
29 #include <iostream>
30 #include <fstream>
31 #include <math.h>
32 #include <string.h>
33 #include "fct_generateur_3d.h"
34 
35 
37 {
38 }
39 
40 
41 
43 {
44  lire(chemin);
45 }
46 
47 template <int N> void FCT_GENERATEUR_3D<N>::lire(char* chemin)
48 {
49  FILE *in;
50  in=fopen(chemin,"rt");
51  if (in==NULL) return;
52  char mess[1000];
53  char* res=fgets(mess,1000,in);
54  int nb_renseignement,pasx,pasy,pasz;
55  double xmin,ymin,zmin,xmax,ymax,zmax;
56  sscanf(mess,"%d %lf %lf %lf %lf %lf %lf %d %d %d",&nb_renseignement,&xmin,&ymin,&zmin,&xmax,&ymax,&zmax,&pasx,&pasy,&pasz);
57  if (nb_renseignement!=N) return;
58  grille.initialiser(xmin,ymin,zmin,xmax,ymax,zmax,pasx,pasy,pasz);
59  for (int i=0;i<nb_renseignement;i++)
60  {
61  char* res=fgets(mess,400,in);
62  mess[strlen(mess)-1]=0;
63  legende[i]=mess;
64  }
65  int nb_cellule=grille.get_nb_cellule();
66  double valmax=-1e-308;
67  for (int i=0;i<nb_cellule;i++)
68  for (int j=0;j<8;j++)
69  {
70  TPL_CELLULE_GRILLE_INFO<CT_POINT<1> *,DOUBLEN<N> > *cellule=grille.get_cellule(i);
71  double x,y,z,val[4];
72  char* res=fgets(mess,400,in);
73  sscanf(mess,"%lf %lf %lf %lf %lf %lf %lf",&x,&y,&z,val,val+1,val+2,val+3);
74  DOUBLEN<N> ecart(val);
75  if (val[0]>valmax)
76  {
77  valeurmax=ecart;
78  valmax=val[0];
79  }
80  cellule->change_info(j,ecart);
81  }
82 
83 }
84 
85 template <int N> double FCT_GENERATEUR_3D<N>::get_valeur_maximale(int num)
86 {
87  return valeurmax.get_valeur(num);
88 }
89 
90 
92 {
93 }
94 
95 template <int N> void FCT_GENERATEUR_3D<N>::evaluer_decompose(double *metrique_depart,double *valeur_propre,double *vecteur_propre)
96 {
97 }
98 
99 template <int N> void FCT_GENERATEUR_3D<N>::get_information(int numcell, int numparam,double *param)
100 {
101  TPL_CELLULE_GRILLE_INFO<CT_POINT<1> *,DOUBLEN<N> > *cell=grille.get_cellule(numcell);
102  DOUBLEN<N> xyz4;
103  double en[8];
104  for (int i=0; i<8; i++)
105  {
106  xyz4=cell->get_info(i);
107  en[i]=xyz4.get_valeur(numparam);
108  }
109  BOITE_3D boite=cell->get_boite();
110  param[0]=boite.get_xmin();
111  param[1]=boite.get_xmax();
112  param[2]=boite.get_xmax();
113  param[3]=boite.get_xmin();
114  param[4]=boite.get_xmin();
115  param[5]=boite.get_xmax();
116  param[6]=boite.get_xmax();
117  param[7]=boite.get_xmin();
118  param[8]=boite.get_ymin();
119  param[9]=boite.get_ymin();
120  param[10]=boite.get_ymax();
121  param[11]=boite.get_ymax();
122  param[12]=boite.get_ymin();
123  param[13]=boite.get_ymin();
124  param[14]=boite.get_ymax();
125  param[15]=boite.get_ymax();
126  param[16]=boite.get_zmin();
127  param[17]=boite.get_zmin();
128  param[18]=boite.get_zmin();
129  param[19]=boite.get_zmin();
130  param[20]=boite.get_zmax();
131  param[21]=boite.get_zmax();
132  param[22]=boite.get_zmax();
133  param[23]=boite.get_zmax();
134  param[24]=en[0];
135  param[25]=en[1];
136  param[26]=en[2];
137  param[27]=en[3];
138  param[28]=en[4];
139  param[29]=en[5];
140  param[30]=en[6];
141  param[31]=en[7];
142 }
143 
144 template <int N> std::string FCT_GENERATEUR_3D<N>::get_legende(int num)
145 {
146  return legende[num];
147 }
148 
149 template <int N> void FCT_GENERATEUR_3D<N>::evaluer(double *xyz, double *res)
150 {
151  TPL_CELLULE_GRILLE_INFO<CT_POINT<1> *,DOUBLEN<N> > *cell=grille.get_cellule(xyz[0],xyz[1],xyz[2]);
152  DOUBLEN<N> xyz4;
153  double en[8];
154  for (int i=0; i<8; i++)
155  {
156  xyz4=cell->get_info(i);
157  en[i]=xyz4.get_valeur(0);
158  }
159  double xsi=-1+2*(xyz[0]-cell->get_boite().get_xmin())/(cell->get_boite().get_xmax()-cell->get_boite().get_xmin());
160  double eta=-1+2*(xyz[1]-cell->get_boite().get_ymin())/(cell->get_boite().get_ymax()-cell->get_boite().get_ymin());
161  double psi=-1+2*(xyz[2]-cell->get_boite().get_zmin())/(cell->get_boite().get_zmax()-cell->get_boite().get_zmin());
162  double a1=1+xsi;
163  double b1=1+eta;
164  double c1=1+psi;
165  double a2=1-xsi;
166  double b2=1-eta;
167  double c2=1-psi;
168  double N1=a2*b2*c2;
169  double N3=a1*b1*c2;
170  double N2=a1*b2*c2;
171  double N4=a2*b1*c2;
172  double N5=a2*b2*c1;
173  double N6=a1*b2*c1;
174  double N7=a1*b1*c1;
175  double N8=a2*b1*c1;
176  double valeur=N1*en[0]+N2*en[1]+N3*en[2]+N4*en[3]+N5*en[4]+N6*en[5]+N7*en[6]+N8*en[7];
177  valeur=valeur/8.;
178  if (fabs(valeur)<1e-12) valeur=1e-154;
179  res[0]=1./valeur/valeur;
180  res[1]=0.;
181  res[2]=0.;
182  res[3]=0.;
183  res[4]=1./valeur/valeur;
184  res[5]=0.;
185  res[6]=0.;
186  res[7]=0.;
187  res[8]=1./valeur/valeur;
188 }
189 
190 
191 
192 template <int N> void FCT_GENERATEUR_3D<N>::deriver(double *xyz, double *res,int num_param)
193 {
194  TPL_CELLULE_GRILLE_INFO<CT_POINT<1> *,DOUBLEN<N> > *cell=grille.get_cellule(xyz[0],xyz[1],xyz[2]);
195  DOUBLEN<N> xyz4;
196  double en[8];
197  for (int i=0; i<8; i++)
198  {
199  xyz4=cell->get_info(i);
200  en[i]=xyz4.get_valeur(num_param);
201  }
202  double xsi=-1+2*(xyz[0]-cell->get_boite().get_xmin())/(cell->get_boite().get_xmax()-cell->get_boite().get_xmin());
203  double eta=-1+2*(xyz[1]-cell->get_boite().get_ymin())/(cell->get_boite().get_ymax()-cell->get_boite().get_ymin());
204  double psi=-1+2*(xyz[2]-cell->get_boite().get_zmin())/(cell->get_boite().get_zmax()-cell->get_boite().get_zmin());
205  double a1=1+xsi;
206  double b1=1+eta;
207  double c1=1+psi;
208  double a2=1-xsi;
209  double b2=1-eta;
210  double c2=1-psi;
211  double N1=a2*b2*c2;
212  double N3=a1*b1*c2;
213  double N2=a1*b2*c2;
214  double N4=a2*b1*c2;
215  double N5=a2*b2*c1;
216  double N6=a1*b2*c1;
217  double N7=a1*b1*c1;
218  double N8=a2*b1*c1;
219  double valeur=N1*en[0]+N2*en[1]+N3*en[2]+N4*en[3]+N5*en[4]+N6*en[5]+N7*en[6]+N8*en[7];
220  valeur=valeur/8.;
221  if (fabs(valeur)<1e-12) valeur=1e-154;
222  res[0]=1./valeur/valeur;
223  res[1]=0.;
224  res[2]=0.;
225  res[3]=0.;
226  res[4]=1./valeur/valeur;
227  res[5]=0.;
228  res[6]=0.;
229  res[7]=0.;
230  res[8]=1./valeur/valeur;
231 }
232 
233 template <int N> int FCT_GENERATEUR_3D<N>::get_nb_cellule(void)
234 {
235  return grille.get_nb_cellule();
236 }
237 
238 template <int N> void FCT_GENERATEUR_3D<N>::enregistrer(char* chemin)
239 {
240  std::ofstream o(chemin,std::ios::out|std::ios::trunc);
241  o.precision(16);
242  o.setf(std::ios::showpoint);
243  int nb=grille.get_nb_cellule();
244  int pasx=grille.get_pasx();
245  int pasy=grille.get_pasy();
246  int pasz=grille.get_pasz();
247  BOITE_3D boite=grille.get_boite();
248  o << N << " " << boite.get_xmin() << " " << boite.get_ymin() << " " << boite.get_zmin() << " " << boite.get_xmax() << " " << boite.get_ymax() << " " << boite.get_zmax() << " " << pasx << " " << pasy << " " << pasz << std::endl;
249  for (int i=0;i<4;i++)
250  o << legende[i] << std::endl;
251  for (int i=0;i<nb;i++)
252  {
253  TPL_CELLULE_GRILLE_INFO<CT_POINT<1> *,DOUBLEN<N> > *cellule=grille.get_cellule(i);
254  BOITE_3D boite=cellule->get_boite();
255  double x1=boite.get_xmin();
256  double y1=boite.get_ymin();
257  double z1=boite.get_zmin();
258  double x2=boite.get_xmax();
259  double y2=boite.get_ymax();
260  double z2=boite.get_zmax();
261  o << x1 << " " << y1 << " " << z1;
262  for (int i=0;i<4;i++)
263  o << " " << cellule->get_info(0).get_valeur(i);
264  o << std::endl;
265  o << x2 << " " << y1 << " " << z1 ;
266  for (int i=0;i<4;i++)
267  o << " " << cellule->get_info(1).get_valeur(i);
268  o << std::endl;
269  o << x2 << " " << y2 << " " << z1 ;
270  for (int i=0;i<4;i++)
271  o << " " << cellule->get_info(2).get_valeur(i);
272  o << std::endl;
273  o << x1 << " " << y2 << " " << z1 ;
274  for (int i=0;i<4;i++)
275  o << " " << cellule->get_info(3).get_valeur(i);
276  o << std::endl;
277  o << x1 << " " << y1 << " " << z2 ;
278  for (int i=0;i<4;i++)
279  o << " " << cellule->get_info(4).get_valeur(i);
280  o << std::endl;
281  o << x2 << " " << y1 << " " << z2 ;
282  for (int i=0;i<4;i++)
283  o << " " << cellule->get_info(5).get_valeur(i);
284  o << std::endl;
285  o << x2 << " " << y2 << " " << z2 ;
286  for (int i=0;i<4;i++)
287  o << " " << cellule->get_info(6).get_valeur(i);
288  o << std::endl;
289  o << x1 << " " << y2 << " " << z2 ;
290  for (int i=0;i<4;i++)
291  o << " " << cellule->get_info(7).get_valeur(i);
292  o << std::endl;
293  }
294 
295 }
296 
297 
298 template <int N> int FCT_GENERATEUR_3D<N>::valide_parametre(double *xyz)
299 {
300  TPL_CELLULE_GRILLE_INFO<CT_POINT<1> *,DOUBLEN<N> > *cell=grille.get_cellule(xyz[0],xyz[1],xyz[2]);
301  if (cell==NULL) return 0;
302  return 1;
303 }
304 
306 {
307  int nb_cellule=get_nb_cellule();
308  double param[32];
309  get_information(0,0,param);
310  double xmin=param[0];
311  double ymin=param[8];
312  double zmin=param[16];
313  get_information(nb_cellule-1,0,param);
314  double xmax=param[1];
315  double ymax=param[10];
316  double zmax=param[20];
317  BOITE_3D boite(xmin,ymin,zmin,xmax,ymax,zmax);
318  return boite;
319 }
320 
321 #ifdef BORLANDCPP
322 template class __export FCT_GENERATEUR_3D<1>;
323 template class __export FCT_GENERATEUR_3D<4>;
324 #else
325 template class FCT_GENERATEUR_3D<1>;
326 template class FCT_GENERATEUR_3D<4>;
327 #endif
328 
329 
330 #pragma package(smart_init)
fct_generateur_3d.h
FCT_GENERATEUR_3D::get_boite_3D
virtual BOITE_3D get_boite_3D(void)
Definition: fct_generateur_3d.cpp:305
FCT_GENERATEUR_3D::lire
void lire(char *chemin)
Definition: fct_generateur_3d.cpp:47
gestionversion.h
BOITE_3D::get_xmin
double get_xmin(void)
Definition: ot_boite_3d.cpp:104
FCT_GENERATEUR_3D::deriver
virtual void deriver(double *xyz, double *res, int num_param=1)
Definition: fct_generateur_3d.cpp:192
FCT_GENERATEUR_3D::enregistrer
virtual void enregistrer(char *chemin)
Definition: fct_generateur_3d.cpp:238
FCT_GENERATEUR_3D
Definition: fct_generateur_3d.h:35
FCT_GENERATEUR_3D::~FCT_GENERATEUR_3D
~FCT_GENERATEUR_3D()
Definition: fct_generateur_3d.cpp:91
FCT_GENERATEUR_3D::get_valeur_maximale
virtual double get_valeur_maximale(int num)
Definition: fct_generateur_3d.cpp:85
FCT_GENERATEUR_3D::get_information
virtual void get_information(int numcell, int numparam, double *param)
Definition: fct_generateur_3d.cpp:99
TPL_CELLULE_GRILLE_INFO::get_boite
BOITE_3D get_boite(void)
Definition: tpl_grille.h:100
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_GENERATEUR_3D::valide_parametre
virtual int valide_parametre(double *param)
Definition: fct_generateur_3d.cpp:298
BOITE_3D::get_xmax
double get_xmax(void)
Definition: ot_boite_3d.cpp:109
TPL_CELLULE_GRILLE_INFO::change_info
void change_info(int num, B val)
Definition: tpl_grille.h:114
FCT_GENERATEUR_3D::evaluer
virtual void evaluer(double *xyz, double *res)
Definition: fct_generateur_3d.cpp:149
FCT_GENERATEUR_3D::evaluer_decompose
virtual void evaluer_decompose(double *metrique_depart, double *valeur_propre, double *vecteur_propre)
Definition: fct_generateur_3d.cpp:95
FCT_GENERATEUR_3D::FCT_GENERATEUR_3D
FCT_GENERATEUR_3D()
Definition: fct_generateur_3d.cpp:36
BOITE_3D::get_ymax
double get_ymax(void)
Definition: ot_boite_3d.cpp:119
TPL_CELLULE_GRILLE_INFO::get_info
B get_info(int num)
Definition: tpl_grille.h:113
BOITE_3D
Definition: ot_boite_3d.h:27
DOUBLEN::get_valeur
double get_valeur(int num)
Definition: ot_mathematique.cpp:1934
TPL_CELLULE_GRILLE_INFO
Definition: tpl_grille.h:93
BOITE_3D::get_zmin
double get_zmin(void)
Definition: ot_boite_3d.cpp:124
res
#define res(i, j)
FCT_GENERATEUR_3D::get_nb_cellule
int get_nb_cellule(void)
Definition: fct_generateur_3d.cpp:233
DOUBLEN
Definition: ot_mathematique.h:457
FCT_TAILLE_METRIQUE
Definition: fct_taille_metrique.h:29
FCT_GENERATEUR_3D::get_legende
virtual std::string get_legende(int num)
Definition: fct_generateur_3d.cpp:144