ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/mailleur_adaptatif.cpp
Revision: 54
Committed: Fri Sep 28 19:43:11 2007 UTC (17 years, 7 months ago) by francois
Original Path: magic/lib/mailleur/mailleur/src/mailleur_adaptatif.cpp
File size: 13760 byte(s)
Log Message:

File Contents

# User Rev Content
1 francois 35 //------------------------------------------------------------
2     //------------------------------------------------------------
3     // MAGiC
4     // Jean Christophe Cuillière et Vincent FRANCOIS
5     // Département de Génie Mécanique - UQTR
6     //------------------------------------------------------------
7     // Le projet MAGIC est un projet de recherche du département
8     // de génie mécanique de l'Université du Québec à
9     // Trois Rivières
10     // Les librairies ne peuvent être utilisées sans l'accord
11     // des auteurs (contact : francois@uqtr.ca)
12     //------------------------------------------------------------
13     //------------------------------------------------------------
14     //
15     // mailleur0d.cpp
16     //
17     //------------------------------------------------------------
18     //------------------------------------------------------------
19     // COPYRIGHT 2000
20     // Version du 02/03/2006 à 11H23
21     //------------------------------------------------------------
22     //------------------------------------------------------------
23    
24    
25     #include "gestionversion.h"
26     #include "mailleur_adaptatif.h"
27     #include "mg_solution.h"
28     #include "mg_maillage.h"
29     #include "fct_taille.h"
30     #include "mailleur0d.h"
31     #include "mailleur1d.h"
32     #include "mailleur2d.h"
33 francois 54 #include "mailleur3d.h"
34 francois 35 #include <math.h>
35    
36 francois 54 #define DETRUIT 2000
37     #define NONDETRUIT 3000
38 francois 35
39    
40 francois 54 MAILLEUR_ADAPTATIF::MAILLEUR_ADAPTATIF(MG_MAILLAGE* mai,MG_MAILLAGE* nvmai,FCT_TAILLE* carte,double coef):MAILLEUR(),mg_maillage(mai),metrique(carte),limite(coef),nv_maillage(nvmai)
41 francois 35 {
42     }
43    
44     MAILLEUR_ADAPTATIF::~MAILLEUR_ADAPTATIF()
45     {
46     }
47    
48     void MAILLEUR_ADAPTATIF::maille(void)
49     {
50 francois 54 if (affichageactif==1) (*affiche)(" Adaptation de maillage");
51     if (affichageactif==1)
52     {
53     char mess[255];
54     sprintf(mess," Destruction des mailles ne respectant pas la carte de taille à %.2f\%",limite*100);
55     (*affiche)(mess);
56     }
57     LISTE_MG_NOEUD::iterator itnoeud;
58     for (MG_NOEUD* noeud=mg_maillage->get_premier_noeud(itnoeud);noeud;noeud=mg_maillage->get_suivant_noeud(itnoeud))
59     noeud->change_nouveau_numero(NONDETRUIT);
60     LISTE_MG_SEGMENT::iterator itsegment;
61     for (MG_SEGMENT* seg=mg_maillage->get_premier_segment(itsegment);seg;seg=mg_maillage->get_suivant_segment(itsegment))
62     seg->change_nouveau_numero(NONDETRUIT);
63     LISTE_MG_TRIANGLE::iterator ittriangle;
64     for (MG_TRIANGLE* tri=mg_maillage->get_premier_triangle(ittriangle);tri;tri=mg_maillage->get_suivant_triangle(ittriangle))
65     tri->change_nouveau_numero(NONDETRUIT);
66     LISTE_MG_TETRA::iterator ittetra;
67     for (MG_TETRA* tet=mg_maillage->get_premier_tetra(ittetra);tet;tet=mg_maillage->get_suivant_tetra(ittetra))
68     tet->change_nouveau_numero(NONDETRUIT);
69    
70    
71 francois 35 MG_SOLUTION* sol=mg_maillage->calculer_carte_taille_reelle("temp.soltmp");
72     sol->active_solution(0);
73 francois 54 for (MG_NOEUD* noeud=mg_maillage->get_premier_noeud(itnoeud);noeud;noeud=mg_maillage->get_suivant_noeud(itnoeud))
74 francois 35 {
75     double *xyz=noeud->get_coord();
76     double tenseur[9];
77     metrique->evaluer(xyz,tenseur);
78     double val=1./sqrt(tenseur[0]);
79     double err=fabs((val-noeud->get_solution())/noeud->get_solution());
80     if (err>limite)
81     {
82     int nb_tetra=noeud->get_lien_tetra()->get_nb();
83     if (nb_tetra!=0)
84     {
85     for (int j=0;j<nb_tetra;j++)
86 francois 54 noeud->get_lien_tetra()->get(j)->change_nouveau_numero(DETRUIT);
87 francois 35 }
88     int nb_tri=noeud->get_lien_triangle()->get_nb();
89     if (nb_tri!=0)
90     {
91     for (int j=0;j<nb_tri;j++)
92     if (noeud->get_lien_triangle()->get(j)->get_lien_topologie()->get_dimension()==2)
93 francois 54 noeud->get_lien_triangle()->get(j)->change_nouveau_numero(DETRUIT);
94 francois 35 }
95     int nb_seg=noeud->get_lien_segment()->get_nb();
96     if (nb_seg!=0)
97     {
98     for (int j=0;j<nb_seg;j++)
99     if (noeud->get_lien_segment()->get(j)->get_lien_topologie()->get_dimension()==1)
100 francois 54 noeud->get_lien_segment()->get(j)->change_nouveau_numero(DETRUIT);
101 francois 35 }
102    
103     }
104     }
105     delete sol;
106 francois 54 for (MG_NOEUD* noeud=mg_maillage->get_premier_noeud(itnoeud);noeud;noeud=mg_maillage->get_suivant_noeud(itnoeud))
107 francois 35 {
108     if (noeud->get_lien_topologie()->get_dimension()==1)
109     {
110     int nb_seg_sur_arete=0;
111     int nb_seg=noeud->get_lien_segment()->get_nb();
112     for (int j=0;j<nb_seg;j++)
113 francois 54 if ((noeud->get_lien_segment()->get(j)->get_lien_topologie()->get_dimension()==1) &&
114     (noeud->get_lien_segment()->get(j)->get_nouveau_numero()==NONDETRUIT))
115     nb_seg_sur_arete++;
116 francois 35
117     if (nb_seg_sur_arete==0)
118     {
119     int nb_tri=noeud->get_lien_triangle()->get_nb();
120     for (int j=0;j<nb_tri;j++)
121     if (noeud->get_lien_triangle()->get(j)->get_lien_topologie()->get_dimension()==2)
122 francois 54 noeud->get_lien_triangle()->get(j)->change_nouveau_numero(DETRUIT);
123 francois 35 int nb_tetra=noeud->get_lien_tetra()->get_nb();
124     for (int j=0;j<nb_tetra;j++)
125 francois 54 noeud->get_lien_tetra()->get(j)->change_nouveau_numero(DETRUIT);
126 francois 35 }
127     }
128     if (noeud->get_lien_topologie()->get_dimension()==2)
129     {
130     int nb_tri_sur_face=0;
131     int nb_tri=noeud->get_lien_triangle()->get_nb();
132     for (int j=0;j<nb_tri;j++)
133 francois 54 if ((noeud->get_lien_triangle()->get(j)->get_lien_topologie()->get_dimension()==2) &&
134     (noeud->get_lien_triangle()->get(j)->get_nouveau_numero()==NONDETRUIT) )
135 francois 35 nb_tri_sur_face++;
136    
137     if (nb_tri_sur_face==0)
138     {
139     int nb_tetra=noeud->get_lien_tetra()->get_nb();
140     for (int j=0;j<nb_tetra;j++)
141 francois 54 noeud->get_lien_tetra()->get(j)->change_nouveau_numero(DETRUIT);
142 francois 35 }
143     }
144     }
145 francois 54 int nb_sommet=mg_maillage->get_mg_geometrie()->get_nb_mg_sommet();
146     for (int i=0;i<nb_sommet;i++)
147     {
148     MG_SOMMET* som=mg_maillage->get_mg_geometrie()->get_mg_sommet(i);
149     int nb_noeud=som->get_lien_maillage()->get_nb();
150     for (int j=0;j<nb_noeud;j++)
151     {
152     MG_NOEUD* noeud=(MG_NOEUD*)som->get_lien_maillage()->get(j);
153     if (mg_maillage->get_mg_noeudid(noeud->get_id())==NULL) continue;
154     if (noeud->get_nouveau_numero()==DETRUIT) continue;
155     MG_NOEUD* nv_noeud=nv_maillage->ajouter_mg_noeud(som,noeud->get_x(),noeud->get_y(),noeud->get_z(),IMPOSE);
156     noeud->change_element_reference(nv_noeud);
157     nv_noeud->change_element_reference(noeud);
158     }
159    
160     }
161     if (affichageactif==1) (*affiche)(" Adaptation maillage 0D");
162     MAILLEUR0D m0d(nv_maillage,nv_maillage->get_mg_geometrie());
163 francois 35 m0d.adapte();
164 francois 54 if (affichageactif==1) (*affiche)(" Adaptation maillage 1D");
165 francois 35 int nb_arete=mg_maillage->get_mg_geometrie()->get_nb_mg_arete();
166     for (int i=0;i<nb_arete;i++)
167     {
168     MG_ARETE* arete=mg_maillage->get_mg_geometrie()->get_mg_arete(i);
169 francois 54 int nb_seg=arete->get_lien_maillage()->get_nb();
170     for (int j=0;j<nb_seg;j++)
171     {
172     MG_SEGMENT* seg=(MG_SEGMENT*)arete->get_lien_maillage()->get(j);
173     if (mg_maillage->get_mg_segmentid(seg->get_id())==NULL) continue;
174     if (seg->get_nouveau_numero()==DETRUIT) continue;
175     MG_NOEUD* noeud1=(MG_NOEUD*)seg->get_noeud1()->get_element_reference();
176     MG_NOEUD* noeud2=(MG_NOEUD*)seg->get_noeud2()->get_element_reference();
177     if (noeud1==NULL)
178     {
179     noeud1=nv_maillage->ajouter_mg_noeud(arete,seg->get_noeud1()->get_x(),seg->get_noeud1()->get_y(),seg->get_noeud1()->get_z(),IMPOSE);
180     noeud1->change_element_reference(seg->get_noeud1());
181     seg->get_noeud1()->change_element_reference(noeud1);
182     }
183     if (noeud2==NULL)
184     {
185     noeud2=nv_maillage->ajouter_mg_noeud(arete,seg->get_noeud2()->get_x(),seg->get_noeud2()->get_y(),seg->get_noeud2()->get_z(),IMPOSE);
186     noeud2->change_element_reference(seg->get_noeud2());
187     seg->get_noeud2()->change_element_reference(noeud2);
188     }
189     nv_maillage->ajouter_mg_segment(arete,noeud1,noeud2,IMPOSE);
190     }
191     MAILLEUR1D m1d(nv_maillage,nv_maillage->get_mg_geometrie(),arete,metrique);
192 francois 35 m1d.adapte();
193     }
194 francois 54 if (affichageactif==1) (*affiche)(" Adaptation maillage 2D");
195 francois 35 int nb_face=mg_maillage->get_mg_geometrie()->get_nb_mg_face();
196     for (int i=0;i<nb_face;i++)
197     {
198     MG_FACE* face=mg_maillage->get_mg_geometrie()->get_mg_face(i);
199     int nb_tri=face->get_lien_maillage()->get_nb();
200     TPL_LISTE_ENTITE<MG_TRIANGLE*> lsttri;
201     for (int j=0;j<nb_tri;j++)
202     {
203     MG_TRIANGLE* tri=(MG_TRIANGLE*)face->get_lien_maillage()->get(j);
204 francois 54 if (mg_maillage->get_mg_triangleid(tri->get_id())==NULL) continue;
205     if (tri->get_nouveau_numero()==DETRUIT) continue;
206 francois 35 MG_NOEUD* noeud1=tri->get_noeud1();
207     MG_NOEUD* noeud2=tri->get_noeud2();
208     MG_NOEUD* noeud3=tri->get_noeud3();
209     double *xyz1,*xyz2,*xyz3;
210     xyz1=noeud1->get_coord();
211     xyz2=noeud2->get_coord();
212     xyz3=noeud3->get_coord();
213     MG_NOEUD* noeudtmp1=new MG_NOEUD(NULL,xyz1[0],xyz1[1],xyz1[2],IMPOSE);
214     MG_NOEUD* noeudtmp2=new MG_NOEUD(NULL,xyz2[0],xyz2[1],xyz2[2],IMPOSE);
215     MG_NOEUD* noeudtmp3=new MG_NOEUD(NULL,xyz3[0],xyz3[1],xyz3[2],IMPOSE);
216     MG_TRIANGLE* tritmp=new MG_TRIANGLE(NULL,noeudtmp1,noeudtmp2,noeudtmp3,NULL,NULL,NULL,IMPOSE);
217     lsttri.ajouter(tritmp);
218     }
219 francois 54 MAILLEUR2D m2d(nv_maillage,nv_maillage->get_mg_geometrie(),face,metrique);
220 francois 35 m2d.maille(face,NULL,&lsttri);
221 francois 54 nb_tri=lsttri.get_nb();
222 francois 35 for (int j=0;j<nb_tri;j++)
223     {
224     MG_TRIANGLE* tri=lsttri.get(0);
225     MG_NOEUD* noeud1=tri->get_noeud1();
226     MG_NOEUD* noeud2=tri->get_noeud2();
227     MG_NOEUD* noeud3=tri->get_noeud3();
228     lsttri.supprimer(tri);
229     delete tri;
230     delete noeud1;
231     delete noeud2;
232     delete noeud3;
233     }
234    
235     }
236 francois 54 if (affichageactif==1) (*affiche)(" Adaptation maillage 3D");
237     int nb_vol=mg_maillage->get_mg_geometrie()->get_nb_mg_volume();
238     for (int i=0;i<nb_vol;i++)
239     {
240     MG_VOLUME* vol=mg_maillage->get_mg_geometrie()->get_mg_volume(i);
241     int nb_tet=vol->get_lien_maillage()->get_nb();
242     TPL_LISTE_ENTITE<MG_TETRA*> lsttet;
243     for (int j=0;j<nb_tet;j++)
244     {
245     MG_TETRA* tet=(MG_TETRA*)vol->get_lien_maillage()->get(j);
246     if (mg_maillage->get_mg_tetraid(tet->get_id())==NULL) continue;
247     if (tet->get_nouveau_numero()==DETRUIT) continue;
248     MG_NOEUD* noeud1=tet->get_noeud1();
249     MG_NOEUD* noeud2=tet->get_noeud2();
250     MG_NOEUD* noeud3=tet->get_noeud3();
251     MG_NOEUD* noeud4=tet->get_noeud4();
252     double *xyz1,*xyz2,*xyz3,*xyz4;
253     xyz1=noeud1->get_coord();
254     xyz2=noeud2->get_coord();
255     xyz3=noeud3->get_coord();
256     xyz4=noeud4->get_coord();
257     MG_NOEUD* noeudtmp1=new MG_NOEUD(NULL,xyz1[0],xyz1[1],xyz1[2],IMPOSE);
258     MG_NOEUD* noeudtmp2=new MG_NOEUD(NULL,xyz2[0],xyz2[1],xyz2[2],IMPOSE);
259     MG_NOEUD* noeudtmp3=new MG_NOEUD(NULL,xyz3[0],xyz3[1],xyz3[2],IMPOSE);
260     MG_NOEUD* noeudtmp4=new MG_NOEUD(NULL,xyz4[0],xyz4[1],xyz4[2],IMPOSE);
261     MG_TETRA* tetra=new MG_TETRA(NULL,noeudtmp1,noeudtmp2,noeudtmp3,noeudtmp4,NULL,NULL,NULL,NULL,IMPOSE);
262     lsttet.ajouter(tetra);
263     }
264     MAILLEUR3D m3d(nv_maillage,nv_maillage->get_mg_geometrie(),vol,metrique);
265     if (affichageactif==1) m3d.active_affichage(affiche);
266     m3d.maille(vol,NULL,&lsttet);
267     nb_tet=lsttet.get_nb();
268     for (int j=0;j<nb_tet;j++)
269     {
270     MG_TETRA* tet=lsttet.get(0);
271     MG_NOEUD* noeud1=tet->get_noeud1();
272     MG_NOEUD* noeud2=tet->get_noeud2();
273     MG_NOEUD* noeud3=tet->get_noeud3();
274     MG_NOEUD* noeud4=tet->get_noeud4();
275     lsttet.supprimer(tet);
276     delete tet;
277     delete noeud1;
278     delete noeud2;
279     delete noeud3;
280     delete noeud4;
281     }
282 francois 35
283 francois 54 }
284    
285     if (affichageactif==1) (*affiche)(" Fin de l'adaptation de maillage");
286 francois 35 }
287    
288    
289