ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/mailleur3d_octal.cpp
Revision: 1189
Committed: Tue Feb 4 17:26:49 2025 UTC (3 months ago) by francois
File size: 10200 byte(s)
Log Message:
Version 5.0 de MAGIC. Integration de ALGLIB pour faire de l'optimisation. ALGLIB se download automatiquement en executant un script dans le repertoire config update_magic.bash


File Contents

# Content
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 //####// mailleur3d_octal.cpp
15 //####//
16 //####//------------------------------------------------------------
17 //####//------------------------------------------------------------
18 //####// COPYRIGHT 2000-2024
19 //####// jeu 13 jun 2024 11:58:55 EDT
20 //####//------------------------------------------------------------
21 //####//------------------------------------------------------------
22
23
24 #include "gestionversion.h"
25 #include "mailleur3d.h"
26
27
28 int MAILLEUR3D::maille(FCT_TAILLE *metri)
29 {
30 metrique=metri;
31 BOITE_3D boite=metri->get_boite_3D();
32 double xmin=boite.get_xmin();
33 double ymin=boite.get_ymin();
34 double zmin=boite.get_zmin();
35 double xmax=boite.get_xmax();
36 double ymax=boite.get_ymax();
37 double zmax=boite.get_zmax();
38 TPL_OCTREE_FCT<MG_NOEUD*,FCT_TAILLE > octree;
39 octree.change_coefficent_multiplicateur(coef);
40 octree.initialiser(*metri,xmin,ymin,zmin,xmax,ymax,zmax);
41 octree.equilibre();
42 int nb_feuille=octree.get_nb_feuille();
43 std::map<int,MG_NOEUD*,std::less<unsigned long> > lst;
44 for (int i=0;i<nb_feuille;i++)
45 {
46 for (int j=0;j<8;j++)
47 {
48 unsigned long keycode=octree.get_feuille_keycode(i,j);
49 if (lst[keycode]==NULL)
50 {
51 double x,y,z;
52 octree.get_xyzsommet_feuille(i,j,x,y,z);
53 MG_NOEUD* noeud=new MG_NOEUD(NULL,x,y,z,MAGIC::ORIGINE::MAILLEUR_AUTO);
54 mg_maillage->ajouter_mg_noeud(noeud);
55 lst[keycode]=noeud;
56 }
57 }
58 }
59 for (int i=0;i<nb_feuille;i++)
60 {
61 TPL_CELLULE_OCTREE<MG_NOEUD*,MG_NOEUD*> *feuille=octree.get_feuille(i);
62 double xyz[3];
63 feuille->boite.get_centre(xyz);
64 MG_NOEUD* noeud=new MG_NOEUD(NULL,xyz[0],xyz[1],xyz[2],MAGIC::ORIGINE::MAILLEUR_AUTO);
65 mg_maillage->ajouter_mg_noeud(noeud);
66 int face[6]={0,0,0,0,0,0};
67 for (int j=0;j<6;j++)
68 {
69 //OUTIL_OCTREE oo;
70 TPL_CELLULE_OCTREE<MG_NOEUD*,MG_NOEUD*> *cell=octree.get_cellule_voisin(feuille,j);
71 if (cell!=NULL)
72 if (cell->feuille==0)
73 face[j]=1;
74 }
75 for (int j=0;j<6;j++)
76 {
77 OUTIL_OCTREE oo;
78 int arete[5]={0,0,0,0};
79 if (face[j]==1)
80 {
81 arete[0]=1;
82 arete[1]=1;
83 arete[2]=1;
84 arete[3]=1;
85 }
86 for (int k=0;k<4;k++)
87 {
88 if (arete[k]==0)
89 {
90 if (face[oo.faceadjacente(j,k)]==1)
91 arete[k]=1;
92 else
93 {
94 int numarete=oo.areteface(j,k);
95 TPL_CELLULE_OCTREE<MG_NOEUD*,MG_NOEUD*> *cell=octree.get_cellule_adjacent(feuille,numarete);
96 if (cell!=NULL)
97 if (cell->feuille==0) arete[k]=1;
98 }
99 }
100 }
101 arete[4]=arete[0]+arete[1]+arete[2]+arete[3];
102 if (arete[4]==0)
103 {
104 unsigned long key1=octree.get_feuille_keycode(i,oo.sommetface(j,0));
105 unsigned long key2=octree.get_feuille_keycode(i,oo.sommetface(j,1));
106 unsigned long key3=octree.get_feuille_keycode(i,oo.sommetface(j,2));
107 unsigned long key4=octree.get_feuille_keycode(i,oo.sommetface(j,3));
108 if ( (j==2) || (j==4) )
109 {
110 if ( (feuille->get_sontype()==0) ||(feuille->get_sontype()==1) ||(feuille->get_sontype()==6) ||(feuille->get_sontype()==7))
111 {
112 insere_tetra(mg_maillage,lst[key1],lst[key3],lst[key2],noeud);
113 insere_tetra(mg_maillage,lst[key1],lst[key4],lst[key3],noeud);
114 }
115 else
116 {
117 insere_tetra(mg_maillage,lst[key1],lst[key2],lst[key4],noeud);
118 insere_tetra(mg_maillage,lst[key2],lst[key3],lst[key4],noeud);
119 }
120 }
121 if ( (j==1) || (j==3) )
122 {
123 if ( (feuille->get_sontype()==0) ||(feuille->get_sontype()==2) ||(feuille->get_sontype()==5) ||(feuille->get_sontype()==7))
124 {
125 insere_tetra(mg_maillage,lst[key1],lst[key3],lst[key2],noeud);
126 insere_tetra(mg_maillage,lst[key1],lst[key4],lst[key3],noeud);
127 }
128 else
129 {
130 insere_tetra(mg_maillage,lst[key1],lst[key2],lst[key4],noeud);
131 insere_tetra(mg_maillage,lst[key2],lst[key3],lst[key4],noeud);
132 }
133 }
134 if ( (j==0) || (j==5) )
135 {
136 if ( (feuille->get_sontype()==0) ||(feuille->get_sontype()==4) ||(feuille->get_sontype()==7) ||(feuille->get_sontype()==3))
137 {
138 insere_tetra(mg_maillage,lst[key1],lst[key3],lst[key2],noeud);
139 insere_tetra(mg_maillage,lst[key1],lst[key4],lst[key3],noeud);
140 }
141 else
142 {
143 insere_tetra(mg_maillage,lst[key1],lst[key2],lst[key4],noeud);
144 insere_tetra(mg_maillage,lst[key2],lst[key3],lst[key4],noeud);
145 }
146 }
147 }
148 else
149 {
150 OUTIL_OCTREE oo;
151 double xcentre=0.,ycentre=0.,zcentre=0.;
152 double x,y,z;
153 octree.get_xyzsommet_feuille(i,oo.sommetface(j,0),x,y,z);
154 xcentre=xcentre+x;
155 ycentre=ycentre+y;
156 zcentre=zcentre+z;
157 octree.get_xyzsommet_feuille(i,oo.sommetface(j,1),x,y,z);
158 xcentre=xcentre+x;
159 ycentre=ycentre+y;
160 zcentre=zcentre+z;
161 octree.get_xyzsommet_feuille(i,oo.sommetface(j,2),x,y,z);
162 xcentre=xcentre+x;
163 ycentre=ycentre+y;
164 zcentre=zcentre+z;
165 octree.get_xyzsommet_feuille(i,oo.sommetface(j,3),x,y,z);
166 xcentre=xcentre+x;
167 ycentre=ycentre+y;
168 zcentre=zcentre+z;
169 xcentre=0.25*xcentre;
170 ycentre=0.25*ycentre;
171 zcentre=0.25*zcentre;
172 unsigned long key=octree.get_keycode(xcentre,ycentre,zcentre);
173 if (lst[key]==NULL)
174 {
175 MG_NOEUD* noeud=new MG_NOEUD(NULL,xcentre,ycentre,zcentre,MAGIC::ORIGINE::MAILLEUR_AUTO);
176 mg_maillage->ajouter_mg_noeud(noeud);
177 lst[key]=noeud;
178 }
179 MG_NOEUD* centroideface=lst[key];
180 for (int k=0;k<4;k++)
181 {
182 unsigned long key1=octree.get_feuille_keycode(i,oo.sommetarete(oo.areteface(j,k),0));
183 unsigned long key2=octree.get_feuille_keycode(i,oo.sommetarete(oo.areteface(j,k),1));
184 if (arete[k]==0)
185 {
186 insere_tetra(mg_maillage,lst[key1],lst[key2],centroideface,noeud);
187 }
188 else
189 {
190 double x1,y1,z1,x2,y2,z2;
191 octree.get_xyzsommet_feuille(i,oo.sommetarete(oo.areteface(j,k),0),x1,y1,z1);
192 octree.get_xyzsommet_feuille(i,oo.sommetarete(oo.areteface(j,k),1),x2,y2,z2);
193 unsigned long keymilieu=octree.get_keycode(0.5*(x1+x2),0.5*(y1+y2),0.5*(z1+z2));
194 insere_tetra(mg_maillage,lst[key1],lst[keymilieu],centroideface,noeud);
195 insere_tetra(mg_maillage,lst[keymilieu],lst[key2],centroideface,noeud);
196
197 }
198 }
199 }
200
201 }
202
203
204 }
205 return OK;
206 }
207
208
209
210 void MAILLEUR3D::insere_tetra(MG_MAILLAGE* mai,MG_NOEUD* noeud1,MG_NOEUD* noeud2,MG_NOEUD* noeud3,MG_NOEUD* noeud4)
211 {
212 double q=OPERATEUR::qualite_tetra(noeud1->get_coord(),noeud2->get_coord(),noeud3->get_coord(),noeud4->get_coord());
213 if (q>0.) mai->ajouter_mg_tetra(NULL,noeud1,noeud2,noeud3,noeud4,MAGIC::ORIGINE::MAILLEUR_AUTO);
214 else mai->ajouter_mg_tetra(NULL,noeud2,noeud1,noeud3,noeud4,MAGIC::ORIGINE::MAILLEUR_AUTO);
215 }
216
217
218
219 void MAILLEUR3D::change_coef(double val)
220 {
221 coef=val;
222 }
223
224 void MAILLEUR3D::verifie_conformite_octale(MG_MAILLAGE* mai,MG_MAILLAGE* maisur)
225 {
226 int nbtri=mai->get_nb_mg_triangle();
227 for (int i=0;i<nbtri;i++)
228 {
229 MG_TRIANGLE* tri=mai->get_mg_triangle(i);
230 if (tri->get_lien_tetra()->get_nb()!=1) continue;
231 MG_NOEUD* noeud[3];
232 noeud[0]=tri->get_noeud1();
233 noeud[1]=tri->get_noeud2();
234 noeud[2]=tri->get_noeud3();
235 MG_NOEUD* n1=new MG_NOEUD(NULL,noeud[0]->get_x(),noeud[0]->get_y(),noeud[0]->get_z(),MAGIC::ORIGINE::MAILLEUR_AUTO);
236 MG_NOEUD* n2=new MG_NOEUD(NULL,noeud[1]->get_x(),noeud[1]->get_y(),noeud[1]->get_z(),MAGIC::ORIGINE::MAILLEUR_AUTO);
237 MG_NOEUD* n3=new MG_NOEUD(NULL,noeud[2]->get_x(),noeud[2]->get_y(),noeud[2]->get_z(),MAGIC::ORIGINE::MAILLEUR_AUTO);
238 maisur->ajouter_mg_noeud(n1);
239 maisur->ajouter_mg_noeud(n2);
240 maisur->ajouter_mg_noeud(n3);
241 maisur->ajouter_mg_triangle(NULL,n1,n2,n3,MAGIC::ORIGINE::MAILLEUR_AUTO);
242 }
243 }