ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/mailleur3d_couche.cpp
Revision: 1189
Committed: Tue Feb 4 17:26:49 2025 UTC (3 months ago) by francois
File size: 15257 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_couche.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_couche.h"
26 #include "mailleur0d.h"
27 #include "mailleur1d.h"
28 #include "mailleur2d.h"
29 #include "mg_gestionnaire.h"
30 #include "mg_geometrie_outils.h"
31 #include "m3d_triangle.h"
32
33 #include "mailleur3d_couche.h"
34
35
36
37
38 MAILLEUR3D_COUCHE::MAILLEUR3D_COUCHE(MG_MAILLAGE* mgmai,MG_GEOMETRIE *mggeo,FCT_TAILLE* fct_taille):MAILLEUR(false),mai(mgmai),geo(mggeo),metrique(fct_taille)
39 {
40
41 }
42
43
44
45 MAILLEUR3D_COUCHE::~MAILLEUR3D_COUCHE()
46 {
47 }
48
49
50
51
52 int MAILLEUR3D_COUCHE::maille(MG_GROUPE_TOPOLOGIQUE* mggt)
53 {
54 return 0;
55 }
56
57
58
59 int MAILLEUR3D_COUCHE::maille(MG_VOLUME *vol)
60 {
61 if (!vol->est_mince()) return OK;
62 affiche((char*)"Mailleur d'un volume mince en pentaedre");
63 for (int i=0;i<vol->get_nb_face_correspondante();i++)
64 {
65 MG_FACE* face1;
66 MG_FACE* face2;
67 vol->get_face_correspondante(i,&face1,&face2);
68 TPL_MAP_ENTITE<MG_SOMMET*> lstsom;
69 TPL_MAP_ENTITE<MG_ARETE*> lstare;
70 MG_FACE* face=face1;
71 TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*> lst;
72 face->get_topologie_sousjacente(&lst);
73 TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*>::ITERATEUR it;
74 for (MG_ELEMENT_TOPOLOGIQUE* ele=lst.get_premier(it);ele!=NULL;ele=lst.get_suivant(it))
75 {
76 if (ele->get_dimension()==0) lstsom.ajouter((MG_SOMMET*)ele);
77 if (ele->get_dimension()==1) lstare.ajouter((MG_ARETE*)ele);
78 }
79 char mess[500];
80 sprintf(mess," Maillage de la face de base %lu",face->get_id());
81 affiche(mess);
82 TPL_MAP_ENTITE<MG_SOMMET*>::ITERATEUR its;
83 for (MG_SOMMET* som=lstsom.get_premier(its);som!=NULL;som=lstsom.get_suivant(its))
84 {
85 bool dejamaille=false;
86 for (int i=0;i<som->get_lien_maillage()->get_nb();i++)
87 if (mai->get_mg_noeudid(som->get_lien_maillage()->get(i)->get_id())!=NULL) {dejamaille=true;break;}
88 if (!dejamaille)
89 {
90 MAILLEUR0D m0d(mai,mai->get_mg_geometrie(),som);
91 m0d.maille();
92 }
93 }
94 TPL_MAP_ENTITE<MG_ARETE*>::ITERATEUR ita;
95 for (MG_ARETE* are=lstare.get_premier(ita);are!=NULL;are=lstare.get_suivant(ita))
96 {
97 bool dejamaille=false;
98 for (int i=0;i<are->get_lien_maillage()->get_nb();i++)
99 if (mai->get_mg_segmentid(are->get_lien_maillage()->get(i)->get_id())!=NULL) {dejamaille=true;break;}
100 if (!dejamaille)
101 {
102 MAILLEUR1D m1d(mai,mai->get_mg_geometrie(),metrique,are);
103 m1d.maille();
104 }
105 }
106 bool dejamaille=false;
107 for (int i=0;i<face->get_lien_maillage()->get_nb();i++)
108 if (mai->get_mg_triangleid(face->get_lien_maillage()->get(i)->get_id())!=NULL) {dejamaille=true;break;}
109 if (!dejamaille)
110 {
111 MAILLEUR2D m2d(mai,mai->get_mg_geometrie(),metrique,face);
112 m2d.active_affichage(affiche2);
113 m2d.maille();
114 }
115 MG_FACE* autreface=face2;
116 sprintf(mess," Maillage de la face extrude %lu",autreface->get_id());
117 affiche(mess);
118 TPL_MAP_ENTITE<MG_SOMMET*> lstasom;
119 TPL_MAP_ENTITE<MG_ARETE*> lstaare;
120 lst.vide();
121 autreface->get_topologie_sousjacente(&lst);
122 for (MG_ELEMENT_TOPOLOGIQUE* ele=lst.get_premier(it);ele!=NULL;ele=lst.get_suivant(it))
123 {
124 if (ele->get_dimension()==0) lstasom.ajouter((MG_SOMMET*)ele);
125 if (ele->get_dimension()==1) lstaare.ajouter((MG_ARETE*)ele);
126 }
127 MG_GEOMETRIE_OUTILS ot;
128 for (MG_SOMMET* som=lstsom.get_premier(its);som!=NULL;som=lstsom.get_suivant(its))
129 {
130 int num=0;
131 MG_NOEUD* noeud;
132 do
133 {
134 noeud=(MG_NOEUD*)som->get_lien_maillage()->get(num);
135 num++;
136 }
137 while (mai->get_mg_noeudid(noeud->get_id())==NULL);
138 if (noeud->get_nouveau_numero()>0) continue;
139 double *xyz=noeud->get_coord();
140 double xyzproj[3];
141 double xyzprojuv[3];
142 ot.projete(xyz,autreface,xyzprojuv,xyzproj);
143 TPL_MAP_ENTITE<MG_SOMMET*>::ITERATEUR its2;
144 MG_SOMMET* somop=NULL;
145 double dist=1e300;
146 for (MG_SOMMET* som2=lstasom.get_premier(its2);som2!=NULL;som2=lstasom.get_suivant(its2))
147 {
148 double xyzsom2[3];
149 som2->get_point()->evaluer(xyzsom2);
150 OT_VECTEUR_3D v(xyzproj,xyzsom2);
151 if (v.get_longueur2()<dist) {dist=v.get_longueur2();somop=som2;}
152 }
153 somop->get_point()->evaluer(xyzproj);
154 MG_NOEUD* no1=new MG_NOEUD(somop,xyzproj[0],xyzproj[1],xyzproj[2],MAGIC::ORIGINE::MAILLEUR_AUTO);
155 mai->ajouter_mg_noeud(no1);
156 noeud->change_nouveau_numero(no1->get_id());
157 }
158 for (MG_ARETE* are=lstare.get_premier(ita);are!=NULL;are=lstare.get_suivant(ita))
159 {
160 TPL_LISTE_ENTITE<MG_SEGMENT*> lstseg;
161 for (int i=0;i<are->get_lien_maillage()->get_nb();i++)
162 if (mai->get_mg_segmentid(are->get_lien_maillage()->get(i)->get_id())!=NULL) lstseg.ajouter((MG_SEGMENT*)are->get_lien_maillage()->get(i));
163 MG_ARETE *areop=NULL;
164 int sens=0;
165 for (int i=0;i<lstseg.get_nb();i++)
166 {
167 MG_SEGMENT* seg=lstseg.get(i);
168 if (seg->get_nouveau_numero()>0) continue;
169 MG_NOEUD* n1=seg->get_noeud1();
170 MG_NOEUD* n2=seg->get_noeud2();
171 MG_NOEUD *no1,*no2;
172 if (n1->get_nouveau_numero()>0) no1=mai->get_mg_noeudid(n1->get_nouveau_numero());
173 else
174 {
175 no1=projete_noeud_sur_arete(n1,autreface,&areop,lstaare);
176 }
177 if (n2->get_nouveau_numero()>0) no2=mai->get_mg_noeudid(n2->get_nouveau_numero());
178 else
179 {
180 no2=projete_noeud_sur_arete(n2,autreface,&areop,lstaare);
181 }
182 MG_SEGMENT* segnv=insere_segment_orientant(areop,no1,no2,sens);
183 seg->change_nouveau_numero(segnv->get_id());
184 }
185 }
186 int sens=0;
187 for (int i=0;i<face->get_lien_maillage()->get_nb();i++)
188 {
189 MG_TRIANGLE* tri=(MG_TRIANGLE*)face->get_lien_maillage()->get(i);
190 if (mai->get_mg_triangleid(tri->get_id())==NULL) continue;
191 MG_NOEUD* n1=tri->get_noeud1();
192 MG_NOEUD* n2=tri->get_noeud2();
193 MG_NOEUD* n3=tri->get_noeud3();
194 double xyzproj[3];
195 double xyzprojuv[3];
196 MG_NOEUD *no1;
197 MG_NOEUD *no2;
198 MG_NOEUD *no3;
199 if (n1->get_nouveau_numero()<1)
200 {
201 double *xyz=n1->get_coord();
202 ot.projete(xyz,autreface,xyzprojuv,xyzproj);
203 no1=new MG_NOEUD(autreface,xyzproj[0],xyzproj[1],xyzproj[2],MAGIC::ORIGINE::MAILLEUR_AUTO);
204 mai->ajouter_mg_noeud(no1);
205 n1->change_nouveau_numero(no1->get_id());
206 }
207 else no1=mai->get_mg_noeudid(n1->get_nouveau_numero());
208 if (n2->get_nouveau_numero()<1)
209 {
210 double *xyz=n2->get_coord();
211 ot.projete(xyz,autreface,xyzprojuv,xyzproj);
212 no2=new MG_NOEUD(autreface,xyzproj[0],xyzproj[1],xyzproj[2],MAGIC::ORIGINE::MAILLEUR_AUTO);
213 mai->ajouter_mg_noeud(no2);
214 n2->change_nouveau_numero(no2->get_id());
215 }
216 else no2=mai->get_mg_noeudid(n2->get_nouveau_numero());
217 if (n3->get_nouveau_numero()<1)
218 {
219 double *xyz=n3->get_coord();
220 ot.projete(xyz,autreface,xyzprojuv,xyzproj);
221 no3=new MG_NOEUD(autreface,xyzproj[0],xyzproj[1],xyzproj[2],MAGIC::ORIGINE::MAILLEUR_AUTO);
222 mai->ajouter_mg_noeud(no3);
223 n3->change_nouveau_numero(no3->get_id());
224 }
225 else no3=mai->get_mg_noeudid(n3->get_nouveau_numero());
226 MG_TRIANGLE* trinv=insere_triangle_orientant(autreface,no1,no2,no3,sens);
227 tri->change_nouveau_numero(trinv->get_id());
228 }
229 }
230 char mess[255];
231 sprintf(mess," Maillage des autres aretes");
232 affiche(mess);
233 TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*> lst,lstbase,lstopp;
234 TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*>::ITERATEUR it;
235 vol->get_topologie_sousjacente(&lst);
236 for (int i=0;i<vol->get_nb_face_correspondante();i++)
237 {
238 MG_FACE* face1;
239 MG_FACE* face2;
240 vol->get_face_correspondante(i,&face1,&face2);
241 face1->get_topologie_sousjacente(&lstbase);
242 face2->get_topologie_sousjacente(&lstopp);
243 lstbase.ajouter(face1);
244 lstopp.ajouter(face2);
245 }
246 for (MG_ELEMENT_TOPOLOGIQUE* ele=lst.get_premier(it);ele!=NULL;ele=lst.get_suivant(it))
247 if (ele->get_dimension()==1)
248 if (!lstbase.existe(ele))
249 if (!lstopp.existe(ele))
250 {
251 MG_SOMMET* som1=((MG_ARETE*)ele)->get_cosommet1()->get_sommet();
252 MG_SOMMET* som2=((MG_ARETE*)ele)->get_cosommet2()->get_sommet();
253 MG_NOEUD* no1;
254 MG_NOEUD* no2;
255 int num=0;
256 do
257 {
258 no1=(MG_NOEUD*)som1->get_lien_maillage()->get(num);
259 num++;
260 }
261 while (mai->get_mg_noeudid(no1->get_id())==NULL);
262 num=0;
263 do
264 {
265 no2=(MG_NOEUD*)som2->get_lien_maillage()->get(num);
266 num++;
267 }
268 while (mai->get_mg_noeudid(no2->get_id())==NULL);
269 int sens=0;
270 insere_segment_orientant((MG_ARETE*)ele,no1,no2,sens);
271 }
272 sprintf(mess," Maillage des autres faces");
273 affiche(mess);
274 for (MG_ELEMENT_TOPOLOGIQUE* ele=lst.get_premier(it);ele!=NULL;ele=lst.get_suivant(it))
275 if (ele->get_dimension()==2)
276 if (!lstbase.existe(ele))
277 if (!lstopp.existe(ele))
278 {
279 MG_FACE *facetmp=(MG_FACE*)ele;
280 TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*> lstf;
281 facetmp->get_topologie_sousjacente(&lstf);
282 TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*>::ITERATEUR it1,it2;
283 MG_ELEMENT_TOPOLOGIQUE* eletmp=lstf.premier_commun(lstbase,it1,it2);
284 while (eletmp->get_dimension()!=1)
285 {
286 eletmp=lstf.suivant_commun(lstbase,it1,it2);
287 }
288 MG_ARETE* arebase=(MG_ARETE*) eletmp;
289 int sens=0;
290 for (int i=0;i<arebase->get_lien_maillage()->get_nb();i++)
291 {
292 MG_SEGMENT* seg=(MG_SEGMENT*)arebase->get_lien_maillage()->get(i);
293 if (mai->get_mg_segmentid(seg->get_id())==NULL) continue;
294 MG_NOEUD *no1=seg->get_noeud1();
295 MG_NOEUD *no4=seg->get_noeud2();
296 MG_NOEUD *no2=mai->get_mg_noeudid(no1->get_nouveau_numero());
297 MG_NOEUD *no3=mai->get_mg_noeudid(no4->get_nouveau_numero());
298 insere_quadrangle_orientant(facetmp,no1,no2,no3,no4,sens);
299
300 }
301 }
302 sprintf(mess," Maillage du volume");
303 affiche(mess);
304 for (MG_ELEMENT_TOPOLOGIQUE* ele=lstbase.get_premier(it);ele!=NULL;ele=lstbase.get_suivant(it))
305 if (ele->get_dimension()==2)
306 {
307 MG_FACE *facetmp=(MG_FACE*)ele;
308 for (int i=0;i<facetmp->get_lien_maillage()->get_nb();i++)
309 {
310 MG_TRIANGLE* tri=(MG_TRIANGLE*)facetmp->get_lien_maillage()->get(i);
311 if (mai->get_mg_triangleid(tri->get_id())==NULL) continue;
312 MG_NOEUD *no1=tri->get_noeud1();
313 MG_NOEUD *no2=tri->get_noeud2();
314 MG_NOEUD *no3=tri->get_noeud3();
315 MG_NOEUD *no4=mai->get_mg_noeudid(no1->get_nouveau_numero());
316 MG_NOEUD *no5=mai->get_mg_noeudid(no2->get_nouveau_numero());
317 MG_NOEUD *no6=mai->get_mg_noeudid(no3->get_nouveau_numero());
318 mai->ajouter_mg_penta(vol,no1,no2,no3,no4,no5,no6,MAGIC::ORIGINE::MAILLEUR_AUTO);
319 }
320 }
321 return OK;
322 }
323
324
325 MG_NOEUD* MAILLEUR3D_COUCHE::projete_noeud_sur_arete(MG_NOEUD* n1, MG_FACE* autreface, MG_ARETE** areop,TPL_MAP_ENTITE<MG_ARETE*> &lstaare)
326 {
327 MG_GEOMETRIE_OUTILS ot;
328 double *xyz=n1->get_coord();
329 double xyzproj[3],xyzprojuv[3];
330 ot.projete(xyz,autreface,xyzprojuv,xyzproj);
331 if (*areop==NULL)
332 {
333 double dist=1e300;
334 TPL_MAP_ENTITE<MG_ARETE*>::ITERATEUR ita2;
335 for (MG_ARETE* are2=lstaare.get_premier(ita2);are2!=NULL;are2=lstaare.get_suivant(ita2))
336 {
337 double t;
338 are2->inverser(t,xyzproj);
339 double xyztmp[3];
340 are2->evaluer(t,xyztmp);
341 OT_VECTEUR_3D v(xyzproj,xyztmp);
342 if (v.get_longueur2()<dist)
343 {
344 dist=v.get_longueur2();
345 *areop=are2;
346 }
347 }
348 }
349 double t;
350 (*areop)->inverser(t,xyzproj);
351 double newxyz[3];
352 (*areop)->evaluer(t,newxyz);
353 MG_NOEUD* no1=new MG_NOEUD(*areop,newxyz[0],newxyz[1],newxyz[2],MAGIC::ORIGINE::MAILLEUR_AUTO);
354 mai->ajouter_mg_noeud(no1);
355 n1->change_nouveau_numero(no1->get_id());
356 return no1;
357 }
358
359 MG_SEGMENT* MAILLEUR3D_COUCHE::insere_segment_orientant(MG_ARETE* are,MG_NOEUD* no1,MG_NOEUD* no2,int &sens)
360 {
361 if (sens==0)
362 {
363 double *xyz1=no1->get_coord();
364 double *xyz2=no2->get_coord();
365 double t;
366 are->inverser(t,xyz1);
367 double dxyz[3];
368 are->deriver(t,dxyz);
369 OT_VECTEUR_3D v1(xyz1,xyz2);
370 OT_VECTEUR_3D v2(dxyz);
371 v1.norme();
372 v2.norme();
373 if (v1*v2>0) sens=1; else sens=-1;
374 }
375 MG_SEGMENT* segnv;
376 if (sens==1) segnv=mai->ajouter_mg_segment(are,no1,no2,MAGIC::ORIGINE::MAILLEUR_AUTO);
377 else if (sens==-1) segnv=mai->ajouter_mg_segment(are,no2,no1,MAGIC::ORIGINE::MAILLEUR_AUTO);
378 return segnv;
379 }
380
381
382 MG_TRIANGLE* MAILLEUR3D_COUCHE::insere_triangle_orientant(MG_FACE* face,MG_NOEUD* no1,MG_NOEUD* no2,MG_NOEUD* no3,int &sens)
383 {
384 if (sens==0)
385 {
386 double *xyz1=no1->get_coord();
387 double *xyz2=no2->get_coord();
388 double *xyz3=no3->get_coord();
389 double uv[3];
390 face->inverser(uv,xyz1);
391 double nor[3];
392 face->calcul_normale_unitaire(uv,nor);
393 OT_VECTEUR_3D n(nor);
394 OT_VECTEUR_3D v1(xyz1,xyz3);
395 OT_VECTEUR_3D v2(xyz1,xyz2);
396 OT_VECTEUR_3D nn=v1&v2;
397 nn.norme();
398 if (n*nn>0) sens=1; else sens=-1;
399 }
400
401
402 MG_NOEUD* nd1;
403 MG_NOEUD* nd2;
404 MG_NOEUD* nd3;
405 if(sens==1) {nd1=no1;nd2=no2;nd3=no3;}
406 else if(sens==-1) {nd1=no1;nd2=no3;nd3=no2;}
407 MG_TRIANGLE* trinv;
408 MG_SEGMENT* mgsegment1=mai->get_mg_segment(no1->get_id(),no2->get_id());
409 MG_SEGMENT* mgsegment2=mai->get_mg_segment(no2->get_id(),no3->get_id());
410 MG_SEGMENT* mgsegment3=mai->get_mg_segment(no3->get_id(),no1->get_id());
411 if (mgsegment1==NULL) mgsegment1=mai->ajouter_mg_segment(face,no1,no2,MAGIC::ORIGINE::MAILLEUR_AUTO);
412 if (mgsegment2==NULL) mgsegment2=mai->ajouter_mg_segment(face,no2,no3,MAGIC::ORIGINE::MAILLEUR_AUTO);
413 if (mgsegment3==NULL) mgsegment3=mai->ajouter_mg_segment(face,no3,no1,MAGIC::ORIGINE::MAILLEUR_AUTO);
414 trinv=new M3D_TRIANGLE(face,no1,no2,no3,mgsegment1,mgsegment2,mgsegment3,MAGIC::ORIGINE::MAILLEUR_AUTO);
415 int resultat=mai->ajouter_mg_triangle(trinv);
416 if (resultat==FAIL)
417 {
418 delete trinv;
419 return NULL;
420 }
421 return trinv;
422 }
423
424 MG_QUADRANGLE* MAILLEUR3D_COUCHE::insere_quadrangle_orientant(MG_FACE* face, MG_NOEUD* no1, MG_NOEUD* no2, MG_NOEUD* no3, MG_NOEUD* no4, int& sens)
425 {
426 if (sens==0)
427 {
428 double *xyz1=no1->get_coord();
429 double *xyz2=no2->get_coord();
430 double *xyz3=no3->get_coord();
431 double uv[3];
432 face->inverser(uv,xyz1);
433 double nor[3];
434 face->calcul_normale_unitaire(uv,nor);
435 OT_VECTEUR_3D n(nor);
436 OT_VECTEUR_3D v1(xyz1,xyz3);
437 OT_VECTEUR_3D v2(xyz1,xyz2);
438 OT_VECTEUR_3D nn=v1&v2;
439 nn.norme();
440 if (n*nn>0) sens=1; else sens=-1;
441 }
442 MG_QUADRANGLE* quadnv;
443 if (sens==1) quadnv=mai->ajouter_mg_quadrangle(face,no1,no2,no3,no4,MAGIC::ORIGINE::MAILLEUR_AUTO);
444 else if (sens==-1) quadnv=mai->ajouter_mg_quadrangle(face,no1,no4,no3,no2,MAGIC::ORIGINE::MAILLEUR_AUTO);
445 return quadnv;
446 }