ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/mailleur_adaptatif.cpp
Revision: 1189
Committed: Tue Feb 4 17:26:49 2025 UTC (3 months ago) by francois
File size: 14237 byte(s)
Log Message:
Version 5.0 de MAGIC. Integration de ALGLIB pour faire de l'optimisation. ALGLIB se download automatiquement en executant un script dans le repertoire config update_magic.bash


File Contents

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