ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/mailleur_adaptatif.cpp
Revision: 425
Committed: Tue Sep 24 22:01:46 2013 UTC (11 years, 11 months ago) by francois
File size: 13821 byte(s)
Log Message:
ajout d'une procedure d'analyse de qualité de maillage + amelioration de la sortie sur terminal des informations dans les mailleurs

File Contents

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