ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/mailleur_adaptatif.cpp
Revision: 479
Committed: Fri Jan 24 19:43:18 2014 UTC (11 years, 3 months ago) by francois
Original Path: magic/lib/mailleur_auto/src/mailleur_adaptatif.cpp
File size: 13863 byte(s)
Log Message:
suppression de warning

File Contents

# User Rev Content
1 francois 35 //------------------------------------------------------------
2     //------------------------------------------------------------
3     // MAGiC
4 francois 210 // Jean Christophe Cuilli�re et Vincent FRANCOIS
5     // D�partement de G�nie M�canique - UQTR
6 francois 35 //------------------------------------------------------------
7 francois 210 // 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 francois 35 // des auteurs (contact : francois@uqtr.ca)
12     //------------------------------------------------------------
13     //------------------------------------------------------------
14     //
15     // mailleur0d.cpp
16     //
17     //------------------------------------------------------------
18     //------------------------------------------------------------
19     // COPYRIGHT 2000
20 francois 210 // Version du 02/03/2006 � 11H23
21 francois 35 //------------------------------------------------------------
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 francois 210 void MAILLEUR_ADAPTATIF::maille(MG_GROUPE_TOPOLOGIQUE* mggt)
50 francois 35 {
51 francois 479 affiche((char*)" Adaptation de maillage");
52 francois 425 char mess[255];
53     sprintf(mess," Destruction des mailles ne respectant pas la carte de taille a %.2f %%",limite*100);
54     affiche(mess);
55 francois 54 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 francois 272 MG_SOLUTION* sol=mg_maillage->calculer_carte_taille_reelle((char*)"temp.soltmp");
70 francois 35 sol->active_solution(0);
71 francois 54 for (MG_NOEUD* noeud=mg_maillage->get_premier_noeud(itnoeud);noeud;noeud=mg_maillage->get_suivant_noeud(itnoeud))
72 francois 35 {
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 francois 54 noeud->get_lien_tetra()->get(j)->change_nouveau_numero(DETRUIT);
85 francois 35 }
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 francois 54 noeud->get_lien_triangle()->get(j)->change_nouveau_numero(DETRUIT);
92 francois 35 }
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 francois 54 noeud->get_lien_segment()->get(j)->change_nouveau_numero(DETRUIT);
99 francois 35 }
100    
101     }
102     }
103     delete sol;
104 francois 54 for (MG_NOEUD* noeud=mg_maillage->get_premier_noeud(itnoeud);noeud;noeud=mg_maillage->get_suivant_noeud(itnoeud))
105 francois 35 {
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 francois 54 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 francois 35
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 francois 54 noeud->get_lien_triangle()->get(j)->change_nouveau_numero(DETRUIT);
121 francois 35 int nb_tetra=noeud->get_lien_tetra()->get_nb();
122     for (int j=0;j<nb_tetra;j++)
123 francois 54 noeud->get_lien_tetra()->get(j)->change_nouveau_numero(DETRUIT);
124 francois 35 }
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 francois 54 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 francois 35 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 francois 54 noeud->get_lien_tetra()->get(j)->change_nouveau_numero(DETRUIT);
140 francois 35 }
141     }
142     }
143 francois 54 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 francois 479 affiche((char*)" Adaptation maillage 0D");
160 francois 54 MAILLEUR0D m0d(nv_maillage,nv_maillage->get_mg_geometrie());
161 francois 35 m0d.adapte();
162 francois 479 affiche((char*)" Adaptation maillage 1D");
163 francois 35 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 francois 54 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 francois 446 MAILLEUR1D m1d(nv_maillage,nv_maillage->get_mg_geometrie(),metrique,arete);
190 francois 35 m1d.adapte();
191     }
192 francois 479 affiche((char*)" Adaptation maillage 2D");
193 francois 35 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 francois 54 if (mg_maillage->get_mg_triangleid(tri->get_id())==NULL) continue;
203     if (tri->get_nouveau_numero()==DETRUIT) continue;
204 francois 35 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 francois 446 MAILLEUR2D m2d(nv_maillage,nv_maillage->get_mg_geometrie(),metrique,face);
218 francois 35 m2d.maille(face,NULL,&lsttri);
219 francois 54 nb_tri=lsttri.get_nb();
220 francois 35 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 francois 479 affiche((char*)" Adaptation maillage 3D");
235 francois 54 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 francois 446 MAILLEUR3D m3d(nv_maillage,nv_maillage->get_mg_geometrie(),metrique,vol);
263 francois 425 m3d.active_affichage(affiche2);
264 francois 61 if (activelog) m3d.active_log(nomlog);
265 francois 54 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 francois 35
282 francois 54 }
283    
284 francois 479 affiche((char*)" Fin de l'adaptation de maillage");
285 francois 35 }
286    
287    
288    
289 francois 61 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