ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/mailleur3d_octal.cpp
Revision: 78
Committed: Thu Apr 10 00:05:47 2008 UTC (17 years, 1 month ago) by francois
Original Path: magic/lib/mailleur/mailleur/src/mailleur3d_octal.cpp
File size: 11799 byte(s)
Log Message:
Ajout du mailleur octal pour XFEM et ajout de fusion de face pour obtenir les cofaces avec vectorisation ameliore

File Contents

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