ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/app/mailleur/src/main.cpp
Revision: 424
Committed: Fri Sep 13 14:39:52 2013 UTC (11 years, 9 months ago) by francois
File size: 15265 byte(s)
Log Message:
analyseur de qualité de maillage plus complet apres les mailleurs 3D

File Contents

# User Rev Content
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 francois 375 bool versioncompilee=false;
107 francois 283 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 francois 375 if (strcmp(argv[i],"-version")==0) versioncompilee=true;
140 francois 283 }
141 francois 375 affiche((char*)"Mailleur MAGiC");
142     if (versioncompilee)
143     {
144     GESTIONVERSION v;
145     char version[500];
146     v.print(version);
147     affiche(version);
148     }
149 francois 283 char message[500];
150     char nomtypecarte[9][9]={"Standard","Fichier"};
151     if (adapt)
152     {
153     affiche((char*)"Adaptation de maillage");
154     sprintf(message," Fichier magic : %s",fichier);
155     affiche(message);
156     sprintf(message," Numero de maillage : %d",nummaillage);
157     affiche(message);
158     sprintf(message," Carte : %s",fichiercarte);
159     affiche(message);
160     MG_FILE gest(fichier);
161     MG_MAILLAGE* mai=gest.get_mg_maillageid(nummaillage);
162     FCT_GENERATEUR_3D<4> carte;
163     FCT_TAILLE* metrique;
164     carte.lire(fichiercarte);
165     metrique=&carte;
166     if (diff) strcpy(fichier,fichier2);
167     MG_MAILLAGE* nvmai=new MG_MAILLAGE(mai->get_mg_geometrie());
168     gest.ajouter_mg_maillage(nvmai);
169     MAILLEUR_ADAPTATIF mesh(mai,nvmai,metrique,limiteadapt);
170     mesh.active_affichage(affiche);
171     if (visufront) mesh.active_log(fichier);
172     mesh.maille();
173     if (analyse)
174     {
175     MAILLEUR3D m3d(nvmai,nvmai->get_mg_geometrie(),NULL,metrique);
176     affiche((char*)"Analyse maillage");
177 francois 424 double vol;int tab[4];
178     m3d.analyse_maillage_obtenu(vol,tab);
179 francois 283 char mess[100];
180 francois 424 sprintf(mess," 1) Respect de la carte de taille");
181     affiche(mess);
182     sprintf(mess," nombre de tetra theorique %f, nombre de tetra pratique %d ",vol,nvmai->get_nb_mg_tetra());
183     affiche(mess);
184     sprintf(mess," erreur : %.2f%%",(nvmai->get_nb_mg_tetra()-vol)*100./vol);
185     affiche(mess);
186     sprintf(mess," 2) Qualite du maillage");
187     affiche(mess);
188     sprintf(mess," nombre de tetra bon (qualite>0.5) : %d (%.2f%%)",tab[3],tab[3]*100./nvmai->get_nb_mg_tetra());
189     affiche(mess);
190     sprintf(mess," nombre de tetra acceptable (qualite>0.2) : %d (%.2f%%) ",tab[2],tab[2]*100./nvmai->get_nb_mg_tetra());
191     affiche(mess);
192     sprintf(mess," nombre de tetra moyen (qualite>0.1) : %d (%.2f%%) ",tab[1],tab[1]*100./nvmai->get_nb_mg_tetra());
193     affiche(mess);
194     sprintf(mess," nombre de tetra mauvais (qualite>0.) : %d (%.2f%%) ",tab[0],tab[0]*100./nvmai->get_nb_mg_tetra());
195     affiche(mess);
196     }
197 francois 283 affiche((char*)"Enregistrement");
198     //strcat(fichier,".magic");
199     gest.enregistrer(fichier);
200     if (exportgmsh)
201     {
202     affiche((char*)"Exportation GMSH");
203     MG_EXPORT exp;
204     exp.gmsh(mai,fichier);
205     }
206     affiche((char*)"Fin");
207     return 1;
208     }
209     if (octal)
210     {
211     sprintf(message," Fichier magic : %s",fichier);
212     affiche(message);
213     sprintf(message," Type de carte : %s",nomtypecarte[1]);
214     affiche(message);
215     sprintf(message," Fichier carte : %s",fichiercarte);
216     affiche(message);
217     affiche((char*)"Lecture carte de taille");
218     FCT_GENERATEUR_3D<4> carte;
219     carte.lire(fichiercarte);
220     affiche((char*)"Maillage");
221     MG_GESTIONNAIRE* gest;
222     MG_FILE* file=new MG_FILE(fichier);
223     if (file->get_code_de_lecture()==0)
224     {
225     delete file;
226     MG_GESTIONNAIRE* gest2=new MG_GESTIONNAIRE;
227     gest=gest2;
228     }
229     else gest=file;
230     MG_MAILLAGE* mgmai=new MG_MAILLAGE(NULL);
231     gest->ajouter_mg_maillage(mgmai);
232     MAILLEUR3D mailleur(&carte,mgmai);
233     mailleur.change_coef(coef);
234     mailleur.maille();
235     if (verif)
236     {
237     affiche((char*)"Verification");
238     MG_MAILLAGE* mgmai2=new MG_MAILLAGE(NULL);
239     gest->ajouter_mg_maillage(mgmai2);
240     mailleur.verifie_conformite_octale(mgmai,mgmai2);
241     }
242     if (fem)
243     {
244     affiche((char*)"Maillage FEM");
245     FEM_MAILLAGE* femmai=new FEM_MAILLAGE(mgmai->get_mg_geometrie(),mgmai,degre);
246     gest->ajouter_fem_maillage(femmai);
247     femmai->construire(0);
248     }
249     affiche((char*)"Enregistrement");
250     gest->enregistrer(fichier);
251     if (exportgmsh)
252     {
253     affiche((char*)"Exportation GMSH");
254     MG_EXPORT exp;
255     if (fem)
256     {
257     affiche((char*)"Maillage FEM");
258     FEM_MAILLAGE* femmai=new FEM_MAILLAGE(mgmai->get_mg_geometrie(),mgmai,degre);
259     gest->ajouter_fem_maillage(femmai);
260     femmai->construire(0);
261     } exp.gmsh(mgmai,fichier);
262     }
263     delete gest;
264     affiche((char*)"Fin");
265     return 1;
266     }
267     affiche((char*)"Parametre d'etude");
268     sprintf(message," Fichier magic : %s",fichier);
269     affiche(message);
270     sprintf(message," Numero de geometrie : %d",numgeometrie);
271     affiche(message);
272     sprintf(message," Type de carte : %s",nomtypecarte[typecarte-1]);
273     affiche(message);
274     if (typecarte==1)
275     {
276     sprintf(message," Eng : %f",dg);
277     affiche(message);
278     sprintf(message," eps : %f",eps);
279     affiche(message);
280     }
281     if (typecarte==2)
282     {
283     sprintf(message," Fichier carte : %s",fichiercarte);
284     affiche(message);
285     }
286     sprintf(message," Parametre de metrique : %2.2f",prioritemetrique*100);
287     affiche(message);
288     affiche((char*)"Lecture du fichier M.A.G.i.C");
289     MG_FILE gest(fichier);
290     MG_GEOMETRIE* mggeo=gest.get_mg_geometrie(numgeometrie);
291     MG_MAILLAGE* mgmai=new MG_MAILLAGE(mggeo);
292     gest.ajouter_mg_maillage(mgmai);
293     FCT_GENERATEUR_3D<4> carte;
294     FCT_TAILLE* metrique;
295     MAILLEUR2D::priorite_metrique=prioritemetrique;
296     MG_GROUPE_TOPOLOGIQUE* mggt=NULL;
297     if (numgroupe!=0)
298     {
299     MG_GEOMETRIE* geo=gest.get_mg_geometrieid(numgeo);
300     mggt=geo->get_mg_groupe_topologiqueid(numgroupe);
301     }
302     if (typecarte==1)
303     {
304     metrique=NULL;
305     MAILLEUR::epsilon=eps;
306     MAILLEUR::distance_maximale=dg;
307     }
308     if (typecarte==2)
309     {
310     affiche((char*)"Lecture carte de taille");
311     carte.lire(fichiercarte);
312     metrique=&carte;
313     }
314     if (niveau>-1)
315     {
316     affiche((char*)"MAILLAGE 0D");
317     MAILLEUR0D m0d(mgmai,mggeo);
318     m0d.maille(mggt);
319     }
320     TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*> lst;
321     if (mggt!=NULL)
322     {
323     int nb=mggt->get_nb();
324     for (int i=0;i<nb;i++)
325     {
326     lst.ajouter(mggt->get(i));
327     mggt->get(i)->get_topologie_sousjacente(&lst);
328     }
329     }
330     if (niveau>0)
331     {
332     affiche((char*)"MAILLAGE 1D");
333     int nb=mggeo->get_nb_mg_arete();
334     for (int i=0;i<nb;i++)
335     {
336     MG_ARETE* arete=mggeo->get_mg_arete(i);
337     if (mggt!=NULL)
338     if (lst.existe(arete)==0) continue;
339     char mess[100];
340     sprintf(mess," arete %d",i);
341     affiche(mess);
342     MAILLEUR1D m1d(mgmai,mggeo,arete,metrique);
343     m1d.maille(mggt);
344     }
345     }
346     if (niveau>1)
347     {
348     affiche((char*)"MAILLAGE 2D");
349     int nb=mggeo->get_nb_mg_face();
350     for (int i=0;i<nb;i++)
351     {
352     MG_FACE* mgface=mggeo->get_mg_face(i);
353     if (mggt!=NULL)
354     if (lst.existe(mgface)==0) continue;
355     char mess[100];
356     sprintf(mess," face %d",i);
357     affiche(mess);
358     MAILLEUR2D m2d(mgmai,mggeo,mgface,metrique);
359     m2d.maille(mggt);
360     }
361     }
362     if (diff) strcpy(fichier,fichier2);
363     if (niveau==3)
364     {
365     affiche((char*)"MAILLAGE 3D");
366     int nb=mggeo->get_nb_mg_volume();
367     for (int i=0;i<nb;i++)
368     {
369     MG_VOLUME* mgvol=mggeo->get_mg_volume(i);
370     if (mggt!=NULL)
371     if (lst.existe(mgvol)==0) continue;
372     MAILLEUR3D m3d(mgmai,mggeo,mgvol,metrique);
373     m3d.active_affichage(affiche);
374     m3d.change_niveau_optimisation(niveauopt);
375     if (visufront) m3d.active_log(fichier);
376     m3d.maille(mgvol);
377     if (analyse)
378     {
379     affiche((char*)"Analyse maillage");
380 francois 424 double vol;int tab[4];
381     m3d.analyse_maillage_obtenu(vol,tab);
382 francois 283 char mess[100];
383 francois 424 sprintf(mess," 1) Respect de la carte de taille");
384     affiche(mess);
385     sprintf(mess," nombre de tetra theorique %f, nombre de tetra pratique %d ",vol,mgmai->get_nb_mg_tetra());
386     affiche(mess);
387     sprintf(mess," erreur : %.2f%%",(mgmai->get_nb_mg_tetra()-vol)*100./vol);
388     affiche(mess);
389     sprintf(mess," 2) Qualite du maillage");
390     affiche(mess);
391     sprintf(mess," nombre de tetra bon (qualite>0.5) : %d (%.2f%%)",tab[3],tab[3]*100./mgmai->get_nb_mg_tetra());
392     affiche(mess);
393     sprintf(mess," nombre de tetra acceptable (qualite>0.2) : %d (%.2f%%) ",tab[2],tab[2]*100./mgmai->get_nb_mg_tetra());
394     affiche(mess);
395     sprintf(mess," nombre de tetra moyen (qualite>0.1) : %d (%.2f%%) ",tab[1],tab[1]*100./mgmai->get_nb_mg_tetra());
396     affiche(mess);
397     sprintf(mess," nombre de tetra mauvais (qualite>0.) : %d (%.2f%%) ",tab[0],tab[0]*100./mgmai->get_nb_mg_tetra());
398     affiche(mess);
399     }
400 francois 283 }
401     }
402     if (fem)
403     {
404     affiche((char*)"Maillage FEM");
405     FEM_MAILLAGE* femmai=new FEM_MAILLAGE(mgmai->get_mg_geometrie(),mgmai,degre);
406     gest.ajouter_fem_maillage(femmai);
407     femmai->construire(0);
408     }
409     affiche((char*)"Enregistrement");
410     gest.enregistrer(fichier);
411     if (exportgmsh)
412     {
413     affiche((char*)"Exportation GMSH");
414     MG_EXPORT exp;
415     exp.gmsh(mgmai,fichier);
416     }
417     affiche((char*)"Fin");
418     return 0;
419     }
420    
421    
422    
423     #pragma package(smart_init)