1 |
francois |
283 |
//------------------------------------------------------------ |
2 |
|
|
//------------------------------------------------------------ |
3 |
|
|
// MAGiC |
4 |
|
|
// Jean Christophe Cuilli�e et Vincent FRANCOIS |
5 |
|
|
// D�artement de G�ie M�anique - UQTR |
6 |
|
|
//------------------------------------------------------------ |
7 |
|
|
// Le projet MAGIC est un projet de recherche du d�artement |
8 |
|
|
// de g�ie m�anique de l'Universit�du Qu�ec � |
9 |
|
|
// Trois Rivi�es |
10 |
|
|
// Les librairies ne peuvent �re utilis�s sans l'accord |
11 |
|
|
// des auteurs (contact : francois@uqtr.ca) |
12 |
|
|
//------------------------------------------------------------ |
13 |
|
|
//------------------------------------------------------------ |
14 |
|
|
// |
15 |
|
|
// main.cpp |
16 |
|
|
// |
17 |
|
|
//------------------------------------------------------------ |
18 |
|
|
//------------------------------------------------------------ |
19 |
|
|
// COPYRIGHT 2000 |
20 |
|
|
// Version du 02/03/2006 �11H25 |
21 |
|
|
//------------------------------------------------------------ |
22 |
|
|
//------------------------------------------------------------ |
23 |
|
|
#include "gestionversion.h" |
24 |
|
|
#ifdef WINDOWS_VERSION |
25 |
|
|
#include "fenetre.h" |
26 |
|
|
#endif |
27 |
|
|
|
28 |
|
|
#pragma hdrstop |
29 |
|
|
|
30 |
|
|
#include "main.h" |
31 |
|
|
#include <string.h> |
32 |
|
|
#include "mg_file.h" |
33 |
|
|
#include "fct_taille.h" |
34 |
|
|
#include "mailleur0d.h" |
35 |
|
|
#include "mailleur1d.h" |
36 |
|
|
#include "mailleur2d.h" |
37 |
|
|
#include "mailleur3d.h" |
38 |
|
|
#include "mailleur_adaptatif.h" |
39 |
|
|
#include "mailleur3d_dia.h" |
40 |
|
|
#include "fct_generateur_3D.h" |
41 |
|
|
#include "mg_export.h" |
42 |
|
|
#include "step_import.h" |
43 |
|
|
#include "acis_import.h" |
44 |
|
|
|
45 |
|
|
//--------------------------------------------------------------------------- |
46 |
|
|
|
47 |
|
|
void affiche(char* message) |
48 |
|
|
{ |
49 |
|
|
#ifdef WINDOWS_VERSION |
50 |
|
|
Form1->Memo1->Lines->Add(message); |
51 |
|
|
#else |
52 |
|
|
std::cout << message << std::endl; |
53 |
|
|
#endif |
54 |
|
|
} |
55 |
|
|
|
56 |
|
|
|
57 |
|
|
|
58 |
|
|
#ifdef WINDOWS_VERSION |
59 |
|
|
int amain(int argc,char **argv) |
60 |
|
|
#else |
61 |
|
|
int main(int argc,char **argv) |
62 |
|
|
#endif |
63 |
|
|
{ |
64 |
|
|
if (argc<3) |
65 |
|
|
{ |
66 |
|
|
affiche((char*)" \ |
67 |
|
|
if (strcmp(argv[i],\"-magic\")==0) strcpy(fichier,argv[i+1]);\n\ |
68 |
|
|
if (strcmp(argv[i],\"-typecarte\")==0) typecarte=atoi(argv[i+1]);\n\ |
69 |
|
|
if (strcmp(argv[i],\"-carte\")==0) strcpy(fichiercarte,argv[i+1]);\n\ |
70 |
|
|
if (strcmp(argv[i],\"-eng\")==0) dg=atof(argv[i+1]);\n\ |
71 |
|
|
if (strcmp(argv[i],\"-eps\")==0) eps=atof(argv[i+1]);\n\ |
72 |
|
|
if (strcmp(argv[i],\"-niveau\")==0) niveau=atoi(argv[i+1]);\n\ |
73 |
|
|
if (strcmp(argv[i],\"-prioritemetrique\")==0) prioritemetrique=atof(argv[i+1]);\n\ |
74 |
|
|
if (strcmp(argv[i],\"-numgeo\")==0) numgeometrie=atoi(argv[i+1]);\n\ |
75 |
|
|
if (strcmp(argv[i],\"-adapt\")==0) adapt=1;\n\ |
76 |
|
|
if (strcmp(argv[i],\"-nummai\")==0) nummaillage=atoi(argv[i+1]);\n\ |
77 |
|
|
if (strcmp(argv[i],\"-exportgmsh\")==0) exportgmsh=1;\n\ |
78 |
|
|
if (strcmp(argv[i],\"-visufront\")==0) visufront=1;\n\ |
79 |
|
|
if (strcmp(argv[i],\"-analyse\")==0) analyse=1;\n\ |
80 |
|
|
if (strcmp(argv[i],\"-out\")==0) {strcpy(fichier2,argv[i+1]);diff=1;}\n\ |
81 |
|
|
if (strcmp(argv[i],\"-niveauopt\")==0) {niveauopt=atoi(argv[i+1]);}\n\ |
82 |
|
|
if (strcmp(argv[i],\"-limitadapt\")==0) {limiteadapt=atof(argv[i+1]);}\n\ |
83 |
|
|
if (strcmp(argv[i],\"-octal\")==0) octal=1;\n\ |
84 |
|
|
if (strcmp(argv[i],\"-verif\")==0) verif=1;\n\ |
85 |
|
|
if (strcmp(argv[i],\"-coef\")==0) coef=atof(argv[i+1]);\n\ |
86 |
|
|
if (strcmp(argv[i],\"-help\")==0) "); |
87 |
|
|
|
88 |
|
|
return 1; |
89 |
|
|
} |
90 |
|
|
char fichier[1000],fichier2[1000],fichiercarte[1000]; |
91 |
|
|
int typecarte,niveau=3,numgeometrie=0,adapt=0,nummaillage=0; |
92 |
|
|
int exportgmsh=0; |
93 |
|
|
int visufront=0; |
94 |
|
|
int analyse=0; |
95 |
|
|
int diff=0; |
96 |
|
|
int niveauopt=2; |
97 |
|
|
int octal=0; |
98 |
|
|
int verif=0; |
99 |
|
|
double coef=2.; |
100 |
|
|
double eps,dg,prioritemetrique=0.65; |
101 |
|
|
double limiteadapt=0.25; |
102 |
|
|
int numgroupe=0; |
103 |
|
|
int numgeo; |
104 |
|
|
int fem=0; |
105 |
|
|
int degre=1; |
106 |
|
|
|
107 |
|
|
for (int i=0;i<argc;i++) |
108 |
|
|
{ |
109 |
|
|
if (strcmp(argv[i],"-magic")==0) strcpy(fichier,argv[i+1]); |
110 |
|
|
if (strcmp(argv[i],"-typecarte")==0) typecarte=atoi(argv[i+1]); |
111 |
|
|
if (strcmp(argv[i],"-carte")==0) strcpy(fichiercarte,argv[i+1]); |
112 |
|
|
if (strcmp(argv[i],"-eng")==0) dg=atof(argv[i+1]); |
113 |
|
|
if (strcmp(argv[i],"-eps")==0) eps=atof(argv[i+1]); |
114 |
|
|
if (strcmp(argv[i],"-niveau")==0) niveau=atoi(argv[i+1]); |
115 |
|
|
if (strcmp(argv[i],"-prioritemetrique")==0) prioritemetrique=atof(argv[i+1]); |
116 |
|
|
if (strcmp(argv[i],"-numgeo")==0) numgeometrie=atoi(argv[i+1]); |
117 |
|
|
if (strcmp(argv[i],"-adapt")==0) adapt=1; |
118 |
|
|
if (strcmp(argv[i],"-nummai")==0) nummaillage=atoi(argv[i+1]); |
119 |
|
|
if (strcmp(argv[i],"-exportgmsh")==0) exportgmsh=1; |
120 |
|
|
if (strcmp(argv[i],"-visufront")==0) visufront=1; |
121 |
|
|
if (strcmp(argv[i],"-analyse")==0) analyse=1; |
122 |
|
|
if (strcmp(argv[i],"-out")==0) { |
123 |
|
|
strcpy(fichier2,argv[i+1]); |
124 |
|
|
diff=1; |
125 |
|
|
} |
126 |
|
|
if (strcmp(argv[i],"-niveauopt")==0) { |
127 |
|
|
niveauopt=atoi(argv[i+1]); |
128 |
|
|
} |
129 |
|
|
if (strcmp(argv[i],"-limitadapt")==0) { |
130 |
|
|
limiteadapt=atof(argv[i+1]); |
131 |
|
|
} |
132 |
|
|
if (strcmp(argv[i],"-octal")==0) octal=1; |
133 |
|
|
if (strcmp(argv[i],"-verif")==0) verif=1; |
134 |
|
|
if (strcmp(argv[i],"-coef")==0) coef=atof(argv[i+1]); |
135 |
|
|
if (strcmp(argv[i],"-groupe")==0) numgroupe=atoi(argv[i+1]); |
136 |
|
|
if (strcmp(argv[i],"-geo")==0) numgeo=atoi(argv[i+1]); |
137 |
|
|
if (strcmp(argv[i],"-fem")==0) fem=1; |
138 |
|
|
if (strcmp(argv[i],"-degre")==0) degre=atoi(argv[i+1]); |
139 |
|
|
|
140 |
|
|
} |
141 |
|
|
char message[500]; |
142 |
|
|
char nomtypecarte[9][9]={"Standard","Fichier"}; |
143 |
|
|
if (adapt) |
144 |
|
|
{ |
145 |
|
|
affiche((char*)"Adaptation de maillage"); |
146 |
|
|
sprintf(message," Fichier magic : %s",fichier); |
147 |
|
|
affiche(message); |
148 |
|
|
sprintf(message," Numero de maillage : %d",nummaillage); |
149 |
|
|
affiche(message); |
150 |
|
|
sprintf(message," Carte : %s",fichiercarte); |
151 |
|
|
affiche(message); |
152 |
|
|
MG_FILE gest(fichier); |
153 |
|
|
MG_MAILLAGE* mai=gest.get_mg_maillageid(nummaillage); |
154 |
|
|
FCT_GENERATEUR_3D<4> carte; |
155 |
|
|
FCT_TAILLE* metrique; |
156 |
|
|
carte.lire(fichiercarte); |
157 |
|
|
metrique=&carte; |
158 |
|
|
if (diff) strcpy(fichier,fichier2); |
159 |
|
|
MG_MAILLAGE* nvmai=new MG_MAILLAGE(mai->get_mg_geometrie()); |
160 |
|
|
gest.ajouter_mg_maillage(nvmai); |
161 |
|
|
MAILLEUR_ADAPTATIF mesh(mai,nvmai,metrique,limiteadapt); |
162 |
|
|
mesh.active_affichage(affiche); |
163 |
|
|
if (visufront) mesh.active_log(fichier); |
164 |
|
|
mesh.maille(); |
165 |
|
|
if (analyse) |
166 |
|
|
{ |
167 |
|
|
MAILLEUR3D m3d(nvmai,nvmai->get_mg_geometrie(),NULL,metrique); |
168 |
|
|
affiche((char*)"Analyse maillage"); |
169 |
|
|
double vol; |
170 |
|
|
m3d.analyse_maillage_obtenu(vol); |
171 |
|
|
char mess[100]; |
172 |
|
|
sprintf(mess," nombre de tetra theorique %f, nombre de tetra pratique %d ",vol,nvmai->get_nb_mg_tetra()); |
173 |
|
|
affiche(mess); |
174 |
|
|
sprintf(mess," erreur %f",(nvmai->get_nb_mg_tetra()-vol)*100./vol); |
175 |
|
|
affiche(mess); |
176 |
|
|
} |
177 |
|
|
affiche((char*)"Enregistrement"); |
178 |
|
|
//strcat(fichier,".magic"); |
179 |
|
|
gest.enregistrer(fichier); |
180 |
|
|
if (exportgmsh) |
181 |
|
|
{ |
182 |
|
|
affiche((char*)"Exportation GMSH"); |
183 |
|
|
MG_EXPORT exp; |
184 |
|
|
exp.gmsh(mai,fichier); |
185 |
|
|
} |
186 |
|
|
affiche((char*)"Fin"); |
187 |
|
|
return 1; |
188 |
|
|
} |
189 |
|
|
if (octal) |
190 |
|
|
{ |
191 |
|
|
sprintf(message," Fichier magic : %s",fichier); |
192 |
|
|
affiche(message); |
193 |
|
|
sprintf(message," Type de carte : %s",nomtypecarte[1]); |
194 |
|
|
affiche(message); |
195 |
|
|
sprintf(message," Fichier carte : %s",fichiercarte); |
196 |
|
|
affiche(message); |
197 |
|
|
affiche((char*)"Lecture carte de taille"); |
198 |
|
|
FCT_GENERATEUR_3D<4> carte; |
199 |
|
|
carte.lire(fichiercarte); |
200 |
|
|
affiche((char*)"Maillage"); |
201 |
|
|
MG_GESTIONNAIRE* gest; |
202 |
|
|
MG_FILE* file=new MG_FILE(fichier); |
203 |
|
|
if (file->get_code_de_lecture()==0) |
204 |
|
|
{ |
205 |
|
|
delete file; |
206 |
|
|
MG_GESTIONNAIRE* gest2=new MG_GESTIONNAIRE; |
207 |
|
|
gest=gest2; |
208 |
|
|
} |
209 |
|
|
else gest=file; |
210 |
|
|
MG_MAILLAGE* mgmai=new MG_MAILLAGE(NULL); |
211 |
|
|
gest->ajouter_mg_maillage(mgmai); |
212 |
|
|
MAILLEUR3D mailleur(&carte,mgmai); |
213 |
|
|
mailleur.change_coef(coef); |
214 |
|
|
mailleur.maille(); |
215 |
|
|
if (verif) |
216 |
|
|
{ |
217 |
|
|
affiche((char*)"Verification"); |
218 |
|
|
MG_MAILLAGE* mgmai2=new MG_MAILLAGE(NULL); |
219 |
|
|
gest->ajouter_mg_maillage(mgmai2); |
220 |
|
|
mailleur.verifie_conformite_octale(mgmai,mgmai2); |
221 |
|
|
} |
222 |
|
|
if (fem) |
223 |
|
|
{ |
224 |
|
|
affiche((char*)"Maillage FEM"); |
225 |
|
|
FEM_MAILLAGE* femmai=new FEM_MAILLAGE(mgmai->get_mg_geometrie(),mgmai,degre); |
226 |
|
|
gest->ajouter_fem_maillage(femmai); |
227 |
|
|
femmai->construire(0); |
228 |
|
|
} |
229 |
|
|
affiche((char*)"Enregistrement"); |
230 |
|
|
gest->enregistrer(fichier); |
231 |
|
|
if (exportgmsh) |
232 |
|
|
{ |
233 |
|
|
affiche((char*)"Exportation GMSH"); |
234 |
|
|
MG_EXPORT exp; |
235 |
|
|
if (fem) |
236 |
|
|
{ |
237 |
|
|
affiche((char*)"Maillage FEM"); |
238 |
|
|
FEM_MAILLAGE* femmai=new FEM_MAILLAGE(mgmai->get_mg_geometrie(),mgmai,degre); |
239 |
|
|
gest->ajouter_fem_maillage(femmai); |
240 |
|
|
femmai->construire(0); |
241 |
|
|
} exp.gmsh(mgmai,fichier); |
242 |
|
|
} |
243 |
|
|
delete gest; |
244 |
|
|
affiche((char*)"Fin"); |
245 |
|
|
return 1; |
246 |
|
|
} |
247 |
|
|
affiche((char*)"Parametre d'etude"); |
248 |
|
|
sprintf(message," Fichier magic : %s",fichier); |
249 |
|
|
affiche(message); |
250 |
|
|
sprintf(message," Numero de geometrie : %d",numgeometrie); |
251 |
|
|
affiche(message); |
252 |
|
|
sprintf(message," Type de carte : %s",nomtypecarte[typecarte-1]); |
253 |
|
|
affiche(message); |
254 |
|
|
if (typecarte==1) |
255 |
|
|
{ |
256 |
|
|
sprintf(message," Eng : %f",dg); |
257 |
|
|
affiche(message); |
258 |
|
|
sprintf(message," eps : %f",eps); |
259 |
|
|
affiche(message); |
260 |
|
|
} |
261 |
|
|
if (typecarte==2) |
262 |
|
|
{ |
263 |
|
|
sprintf(message," Fichier carte : %s",fichiercarte); |
264 |
|
|
affiche(message); |
265 |
|
|
} |
266 |
|
|
sprintf(message," Parametre de metrique : %2.2f",prioritemetrique*100); |
267 |
|
|
affiche(message); |
268 |
|
|
affiche((char*)"Lecture du fichier M.A.G.i.C"); |
269 |
|
|
MG_FILE gest(fichier); |
270 |
|
|
MG_GEOMETRIE* mggeo=gest.get_mg_geometrie(numgeometrie); |
271 |
|
|
MG_MAILLAGE* mgmai=new MG_MAILLAGE(mggeo); |
272 |
|
|
gest.ajouter_mg_maillage(mgmai); |
273 |
|
|
FCT_GENERATEUR_3D<4> carte; |
274 |
|
|
FCT_TAILLE* metrique; |
275 |
|
|
MAILLEUR2D::priorite_metrique=prioritemetrique; |
276 |
|
|
MG_GROUPE_TOPOLOGIQUE* mggt=NULL; |
277 |
|
|
if (numgroupe!=0) |
278 |
|
|
{ |
279 |
|
|
MG_GEOMETRIE* geo=gest.get_mg_geometrieid(numgeo); |
280 |
|
|
mggt=geo->get_mg_groupe_topologiqueid(numgroupe); |
281 |
|
|
} |
282 |
|
|
if (typecarte==1) |
283 |
|
|
{ |
284 |
|
|
metrique=NULL; |
285 |
|
|
MAILLEUR::epsilon=eps; |
286 |
|
|
MAILLEUR::distance_maximale=dg; |
287 |
|
|
} |
288 |
|
|
if (typecarte==2) |
289 |
|
|
{ |
290 |
|
|
affiche((char*)"Lecture carte de taille"); |
291 |
|
|
carte.lire(fichiercarte); |
292 |
|
|
metrique=&carte; |
293 |
|
|
} |
294 |
|
|
if (niveau>-1) |
295 |
|
|
{ |
296 |
|
|
affiche((char*)"MAILLAGE 0D"); |
297 |
|
|
MAILLEUR0D m0d(mgmai,mggeo); |
298 |
|
|
m0d.maille(mggt); |
299 |
|
|
} |
300 |
|
|
TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*> lst; |
301 |
|
|
if (mggt!=NULL) |
302 |
|
|
{ |
303 |
|
|
int nb=mggt->get_nb(); |
304 |
|
|
for (int i=0;i<nb;i++) |
305 |
|
|
{ |
306 |
|
|
lst.ajouter(mggt->get(i)); |
307 |
|
|
mggt->get(i)->get_topologie_sousjacente(&lst); |
308 |
|
|
} |
309 |
|
|
} |
310 |
|
|
if (niveau>0) |
311 |
|
|
{ |
312 |
|
|
affiche((char*)"MAILLAGE 1D"); |
313 |
|
|
int nb=mggeo->get_nb_mg_arete(); |
314 |
|
|
for (int i=0;i<nb;i++) |
315 |
|
|
{ |
316 |
|
|
MG_ARETE* arete=mggeo->get_mg_arete(i); |
317 |
|
|
if (mggt!=NULL) |
318 |
|
|
if (lst.existe(arete)==0) continue; |
319 |
|
|
char mess[100]; |
320 |
|
|
sprintf(mess," arete %d",i); |
321 |
|
|
affiche(mess); |
322 |
|
|
MAILLEUR1D m1d(mgmai,mggeo,arete,metrique); |
323 |
|
|
m1d.maille(mggt); |
324 |
|
|
} |
325 |
|
|
} |
326 |
|
|
if (niveau>1) |
327 |
|
|
{ |
328 |
|
|
affiche((char*)"MAILLAGE 2D"); |
329 |
|
|
int nb=mggeo->get_nb_mg_face(); |
330 |
|
|
for (int i=0;i<nb;i++) |
331 |
|
|
{ |
332 |
|
|
MG_FACE* mgface=mggeo->get_mg_face(i); |
333 |
|
|
if (mggt!=NULL) |
334 |
|
|
if (lst.existe(mgface)==0) continue; |
335 |
|
|
char mess[100]; |
336 |
|
|
sprintf(mess," face %d",i); |
337 |
|
|
affiche(mess); |
338 |
|
|
MAILLEUR2D m2d(mgmai,mggeo,mgface,metrique); |
339 |
|
|
m2d.maille(mggt); |
340 |
|
|
} |
341 |
|
|
} |
342 |
|
|
if (diff) strcpy(fichier,fichier2); |
343 |
|
|
if (niveau==3) |
344 |
|
|
{ |
345 |
|
|
affiche((char*)"MAILLAGE 3D"); |
346 |
|
|
int nb=mggeo->get_nb_mg_volume(); |
347 |
|
|
for (int i=0;i<nb;i++) |
348 |
|
|
{ |
349 |
|
|
MG_VOLUME* mgvol=mggeo->get_mg_volume(i); |
350 |
|
|
if (mggt!=NULL) |
351 |
|
|
if (lst.existe(mgvol)==0) continue; |
352 |
|
|
MAILLEUR3D m3d(mgmai,mggeo,mgvol,metrique); |
353 |
|
|
m3d.active_affichage(affiche); |
354 |
|
|
m3d.change_niveau_optimisation(niveauopt); |
355 |
|
|
if (visufront) m3d.active_log(fichier); |
356 |
|
|
m3d.maille(mgvol); |
357 |
|
|
if (analyse) |
358 |
|
|
{ |
359 |
|
|
affiche((char*)"Analyse maillage"); |
360 |
|
|
double vol; |
361 |
|
|
m3d.analyse_maillage_obtenu(vol); |
362 |
|
|
char mess[100]; |
363 |
|
|
sprintf(mess," nombre de tetra theorique %f, nombre de tetra pratique %d ",vol,mgmai->get_nb_mg_tetra()); |
364 |
|
|
affiche(mess); |
365 |
|
|
sprintf(mess," erreur %f",(mgmai->get_nb_mg_tetra()-vol)*100./vol); |
366 |
|
|
affiche(mess); |
367 |
|
|
} |
368 |
|
|
} |
369 |
|
|
} |
370 |
|
|
if (fem) |
371 |
|
|
{ |
372 |
|
|
affiche((char*)"Maillage FEM"); |
373 |
|
|
FEM_MAILLAGE* femmai=new FEM_MAILLAGE(mgmai->get_mg_geometrie(),mgmai,degre); |
374 |
|
|
gest.ajouter_fem_maillage(femmai); |
375 |
|
|
femmai->construire(0); |
376 |
|
|
} |
377 |
|
|
affiche((char*)"Enregistrement"); |
378 |
|
|
gest.enregistrer(fichier); |
379 |
|
|
if (exportgmsh) |
380 |
|
|
{ |
381 |
|
|
affiche((char*)"Exportation GMSH"); |
382 |
|
|
MG_EXPORT exp; |
383 |
|
|
exp.gmsh(mgmai,fichier); |
384 |
|
|
} |
385 |
|
|
affiche((char*)"Fin"); |
386 |
|
|
return 0; |
387 |
|
|
} |
388 |
|
|
|
389 |
|
|
|
390 |
|
|
|
391 |
|
|
#pragma package(smart_init) |