ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/mailleur3d_octal.cpp
Revision: 951
Committed: Fri Aug 10 15:17:17 2018 UTC (6 years, 9 months ago) by couturad
Original Path: magic/lib/mailleur_auto/src/mailleur3d_octal.cpp
File size: 10112 byte(s)
Log Message:
-> Ajout de Project Chrono (voir CMakeLists.txt).
-> Ajout d'un générateur de microstructure basé sur la dynamique des corps rigides (MSTRUCT_GENERATEUR_DCR).
-> Ajout d'un opérateur de décallage de la topologie (MG_CG_OP_TRANSF_DECALLAGE).
-> Retrait de «using namespace std»  (conflit avec namespace chrono) et modification des fichiers affectés.
-> Modification de mailleur2d.cpp afin d'enregistrer un fichier MAGiC (void.magic) lorsque le nombre d'itération dépasse la valeur maximale.

File Contents

# User Rev Content
1 francois 283 //------------------------------------------------------------
2     //------------------------------------------------------------
3     // MAGiC
4     // Jean Christophe Cuilli�e et Vincent FRANCOIS
5     // D�artement de G�ie M�anique - UQTR
6     //------------------------------------------------------------
7     // Le projet MAGIC est un projet de recherche du d�artement
8     // de g�ie m�anique de l'Universit�du Qu�ec �
9     // Trois Rivi�es
10     // Les librairies ne peuvent �re utilis�s sans l'accord
11     // des auteurs (contact : francois@uqtr.ca)
12     //------------------------------------------------------------
13     //------------------------------------------------------------
14     //
15     // mailleur3d.cpp
16     //
17     //------------------------------------------------------------
18     //------------------------------------------------------------
19     // COPYRIGHT 2000
20     // Version du 02/03/2006 �11H23
21     //------------------------------------------------------------
22     //------------------------------------------------------------
23    
24    
25     #include "gestionversion.h"
26     #include "mailleur3d.h"
27    
28    
29 francois 467 void MAILLEUR3D::maille(FCT_TAILLE *metri)
30 francois 283 {
31 francois 467 metrique=metri;
32     BOITE_3D boite=metri->get_boite_3D();
33     double xmin=boite.get_xmin();
34     double ymin=boite.get_ymin();
35     double zmin=boite.get_zmin();
36     double xmax=boite.get_xmax();
37     double ymax=boite.get_ymax();
38     double zmax=boite.get_zmax();
39     TPL_OCTREE_FCT<MG_NOEUD*,FCT_TAILLE > octree;
40 francois 283 octree.change_coefficent_multiplicateur(coef);
41 francois 467 octree.initialiser(*metri,xmin,ymin,zmin,xmax,ymax,zmax);
42 francois 283 octree.equilibre();
43     int nb_feuille=octree.get_nb_feuille();
44 couturad 951 std::map<int,MG_NOEUD*,std::less<unsigned long> > lst;
45 francois 283 for (int i=0;i<nb_feuille;i++)
46     {
47     for (int j=0;j<8;j++)
48     {
49     unsigned long keycode=octree.get_feuille_keycode(i,j);
50     if (lst[keycode]==NULL)
51     {
52     double x,y,z;
53     octree.get_xyzsommet_feuille(i,j,x,y,z);
54 francois 791 MG_NOEUD* noeud=new MG_NOEUD(NULL,x,y,z,MAGIC::ORIGINE::MAILLEUR_AUTO);
55 francois 283 mg_maillage->ajouter_mg_noeud(noeud);
56     lst[keycode]=noeud;
57     }
58     }
59     }
60     for (int i=0;i<nb_feuille;i++)
61     {
62     TPL_CELLULE_OCTREE<MG_NOEUD*,MG_NOEUD*> *feuille=octree.get_feuille(i);
63     double xyz[3];
64     feuille->boite.get_centre(xyz);
65 francois 791 MG_NOEUD* noeud=new MG_NOEUD(NULL,xyz[0],xyz[1],xyz[2],MAGIC::ORIGINE::MAILLEUR_AUTO);
66 francois 283 mg_maillage->ajouter_mg_noeud(noeud);
67     int face[6]={0,0,0,0,0,0};
68     for (int j=0;j<6;j++)
69     {
70     //OUTIL_OCTREE oo;
71     TPL_CELLULE_OCTREE<MG_NOEUD*,MG_NOEUD*> *cell=octree.get_cellule_voisin(feuille,j);
72     if (cell!=NULL)
73     if (cell->feuille==0)
74     face[j]=1;
75     }
76     for (int j=0;j<6;j++)
77     {
78     OUTIL_OCTREE oo;
79     int arete[5]={0,0,0,0};
80     if (face[j]==1)
81     {
82     arete[0]=1;
83     arete[1]=1;
84     arete[2]=1;
85     arete[3]=1;
86     }
87     for (int k=0;k<4;k++)
88     {
89     if (arete[k]==0)
90     {
91     if (face[oo.faceadjacente(j,k)]==1)
92     arete[k]=1;
93     else
94     {
95     int numarete=oo.areteface(j,k);
96     TPL_CELLULE_OCTREE<MG_NOEUD*,MG_NOEUD*> *cell=octree.get_cellule_adjacent(feuille,numarete);
97     if (cell!=NULL)
98     if (cell->feuille==0) arete[k]=1;
99     }
100     }
101     }
102     arete[4]=arete[0]+arete[1]+arete[2]+arete[3];
103     if (arete[4]==0)
104     {
105     unsigned long key1=octree.get_feuille_keycode(i,oo.sommetface(j,0));
106     unsigned long key2=octree.get_feuille_keycode(i,oo.sommetface(j,1));
107     unsigned long key3=octree.get_feuille_keycode(i,oo.sommetface(j,2));
108     unsigned long key4=octree.get_feuille_keycode(i,oo.sommetface(j,3));
109     if ( (j==2) || (j==4) )
110     {
111     if ( (feuille->get_sontype()==0) ||(feuille->get_sontype()==1) ||(feuille->get_sontype()==6) ||(feuille->get_sontype()==7))
112     {
113     insere_tetra(mg_maillage,lst[key1],lst[key3],lst[key2],noeud);
114     insere_tetra(mg_maillage,lst[key1],lst[key4],lst[key3],noeud);
115     }
116     else
117     {
118     insere_tetra(mg_maillage,lst[key1],lst[key2],lst[key4],noeud);
119     insere_tetra(mg_maillage,lst[key2],lst[key3],lst[key4],noeud);
120     }
121     }
122     if ( (j==1) || (j==3) )
123     {
124     if ( (feuille->get_sontype()==0) ||(feuille->get_sontype()==2) ||(feuille->get_sontype()==5) ||(feuille->get_sontype()==7))
125     {
126     insere_tetra(mg_maillage,lst[key1],lst[key3],lst[key2],noeud);
127     insere_tetra(mg_maillage,lst[key1],lst[key4],lst[key3],noeud);
128     }
129     else
130     {
131     insere_tetra(mg_maillage,lst[key1],lst[key2],lst[key4],noeud);
132     insere_tetra(mg_maillage,lst[key2],lst[key3],lst[key4],noeud);
133     }
134     }
135     if ( (j==0) || (j==5) )
136     {
137     if ( (feuille->get_sontype()==0) ||(feuille->get_sontype()==4) ||(feuille->get_sontype()==7) ||(feuille->get_sontype()==3))
138     {
139     insere_tetra(mg_maillage,lst[key1],lst[key3],lst[key2],noeud);
140     insere_tetra(mg_maillage,lst[key1],lst[key4],lst[key3],noeud);
141     }
142     else
143     {
144     insere_tetra(mg_maillage,lst[key1],lst[key2],lst[key4],noeud);
145     insere_tetra(mg_maillage,lst[key2],lst[key3],lst[key4],noeud);
146     }
147     }
148     }
149     else
150     {
151     OUTIL_OCTREE oo;
152     double xcentre=0.,ycentre=0.,zcentre=0.;
153     double x,y,z;
154     octree.get_xyzsommet_feuille(i,oo.sommetface(j,0),x,y,z);
155     xcentre=xcentre+x;
156     ycentre=ycentre+y;
157     zcentre=zcentre+z;
158     octree.get_xyzsommet_feuille(i,oo.sommetface(j,1),x,y,z);
159     xcentre=xcentre+x;
160     ycentre=ycentre+y;
161     zcentre=zcentre+z;
162     octree.get_xyzsommet_feuille(i,oo.sommetface(j,2),x,y,z);
163     xcentre=xcentre+x;
164     ycentre=ycentre+y;
165     zcentre=zcentre+z;
166     octree.get_xyzsommet_feuille(i,oo.sommetface(j,3),x,y,z);
167     xcentre=xcentre+x;
168     ycentre=ycentre+y;
169     zcentre=zcentre+z;
170     xcentre=0.25*xcentre;
171     ycentre=0.25*ycentre;
172     zcentre=0.25*zcentre;
173     unsigned long key=octree.get_keycode(xcentre,ycentre,zcentre);
174     if (lst[key]==NULL)
175     {
176 francois 791 MG_NOEUD* noeud=new MG_NOEUD(NULL,xcentre,ycentre,zcentre,MAGIC::ORIGINE::MAILLEUR_AUTO);
177 francois 283 mg_maillage->ajouter_mg_noeud(noeud);
178     lst[key]=noeud;
179     }
180     MG_NOEUD* centroideface=lst[key];
181     for (int k=0;k<4;k++)
182     {
183     unsigned long key1=octree.get_feuille_keycode(i,oo.sommetarete(oo.areteface(j,k),0));
184     unsigned long key2=octree.get_feuille_keycode(i,oo.sommetarete(oo.areteface(j,k),1));
185     if (arete[k]==0)
186     {
187     insere_tetra(mg_maillage,lst[key1],lst[key2],centroideface,noeud);
188     }
189     else
190     {
191     double x1,y1,z1,x2,y2,z2;
192     octree.get_xyzsommet_feuille(i,oo.sommetarete(oo.areteface(j,k),0),x1,y1,z1);
193     octree.get_xyzsommet_feuille(i,oo.sommetarete(oo.areteface(j,k),1),x2,y2,z2);
194     unsigned long keymilieu=octree.get_keycode(0.5*(x1+x2),0.5*(y1+y2),0.5*(z1+z2));
195     insere_tetra(mg_maillage,lst[key1],lst[keymilieu],centroideface,noeud);
196     insere_tetra(mg_maillage,lst[keymilieu],lst[key2],centroideface,noeud);
197    
198     }
199     }
200     }
201    
202     }
203    
204    
205     }
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 francois 791 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 francois 283 }
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 francois 791 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 francois 283 maisur->ajouter_mg_noeud(n1);
239     maisur->ajouter_mg_noeud(n2);
240     maisur->ajouter_mg_noeud(n3);
241 francois 791 maisur->ajouter_mg_triangle(NULL,n1,n2,n3,MAGIC::ORIGINE::MAILLEUR_AUTO);
242 francois 283 }
243     }