ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/mailleur_adaptatif.cpp
Revision: 61
Committed: Fri Nov 16 16:39:29 2007 UTC (17 years, 6 months ago) by francois
Original Path: magic/lib/mailleur/mailleur/src/mailleur_adaptatif.cpp
File size: 14013 byte(s)
Log Message:
Bub mailleur 3D + visualisation du front optimisée

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