ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/app/calculs/src/main2.cpp
Revision: 1157
Committed: Thu Jun 13 22:18:27 2024 UTC (15 months, 2 weeks ago) by francois
File size: 11880 byte(s)
Log Message:
compatibilité Ubuntu 22.04
Suppression des refeences à Windows
Ajout d'une banière

File Contents

# User Rev Content
1 francois 1157 //####//------------------------------------------------------------
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     //####// main2.cpp
15     //####//
16     //####//------------------------------------------------------------
17     //####//------------------------------------------------------------
18     //####// COPYRIGHT 2000-2024
19     //####// jeu 13 jun 2024 11:57:20 EDT
20     //####//------------------------------------------------------------
21     //####//------------------------------------------------------------
22 francois 896
23     #include "gestionversion.h"
24    
25    
26     #include <string.h>
27     #include "mg_file.h"
28     #include <math.h>
29     #include "magic_application.h"
30 francois 1117 #include "mg_fast_marching2D.h"
31     #include "mg_geodesic.h"
32 francois 896 #include "fem_maillage_outils.h"
33     #include "mg_export.h"
34    
35    
36    
37    
38     int main(int argc,char **argv)
39     {
40     std::vector<MAGIC_PARAMETRE_APPLICATION> lst;
41 francois 1117 MAGIC_PARAMETRE_APPLICATION p1(2,(char*)"-fm2d",MAGIC_PARAMETRE_APPLICATION::ACTION,(char*)"Fast marching sur une face");
42 francois 896 MAGIC_PARAMETRE_APPLICATION p2(3,(char*)"-num",MAGIC_PARAMETRE_APPLICATION::INTEGER,(char*)"Id de la face à calculer");
43     MAGIC_PARAMETRE_APPLICATION p3(4,(char*)"-numsol",MAGIC_PARAMETRE_APPLICATION::INTEGER,(char*)"Id de la solution pour le calcul de fast_marching (defaut la premiere)");
44     MAGIC_PARAMETRE_APPLICATION p4(5,(char*)"-nummai",MAGIC_PARAMETRE_APPLICATION::INTEGER,(char*)"Id du maillage à utiliser pour effectuer le fast_marching pour une nouvelle solution (defaut le premier)");
45     MAGIC_PARAMETRE_APPLICATION p5(6,(char*)"-numchamp",MAGIC_PARAMETRE_APPLICATION::INTEGER,(char*)"Numero du champ dans la solution (defaut le premier)");
46 francois 1117 MAGIC_PARAMETRE_APPLICATION p6(7,(char*)"-init",MAGIC_PARAMETRE_APPLICATION::STRING,(char*)"Liste des entités qui forment l'iso 0 sous la forme id1,id2,id3");
47     MAGIC_PARAMETRE_APPLICATION p7(8,(char*)"-geodesicid",MAGIC_PARAMETRE_APPLICATION::ACTION,(char*)"Fast marching pour calculer la geodesic entre deux sommets sur une face");
48     MAGIC_PARAMETRE_APPLICATION p8(9,(char*)"-geodesiccoord",MAGIC_PARAMETRE_APPLICATION::ACTION,(char*)"Fast marching pour calculer la geodesic entre deux points sur une face");
49     MAGIC_PARAMETRE_APPLICATION p9(10,(char*)"-geodesicreseau",MAGIC_PARAMETRE_APPLICATION::ACTION,(char*)"Fast marching pour calculer la geodesic entre une liste de points sur une face");
50 francois 1110 MAGIC_PARAMETRE_APPLICATION p10(11,(char*)"-fichierliste",MAGIC_PARAMETRE_APPLICATION::STRING,(char*)"Nom du fichier de la liste de points ");
51     MAGIC_PARAMETRE_APPLICATION p11(12,(char*)"-fichiermat",MAGIC_PARAMETRE_APPLICATION::STRING,(char*)"Nom du fichier de la matrice des distances ");
52 francois 1117 MAGIC_PARAMETRE_APPLICATION p12(13,(char*)"-pointid",MAGIC_PARAMETRE_APPLICATION::STRING,(char*)"Id des sommets de la geodesic sous la forme id1,id2");
53     MAGIC_PARAMETRE_APPLICATION p13(14,(char*)"-pointxyz",MAGIC_PARAMETRE_APPLICATION::STRING,(char*)"Sommets de la geodesic sous la forme x,y,z,x,y,z");
54 francois 896
55     p1.ajouter_dependance(1),p1.ajouter_dependance(3);p1.ajouter_dependance(4);p1.ajouter_dependance(5);p1.ajouter_dependance(6);p1.ajouter_dependance(7);
56 francois 1117 p7.ajouter_dependance(1),p7.ajouter_dependance(3);p7.ajouter_dependance(5);p7.ajouter_dependance(13);
57     p8.ajouter_dependance(1),p8.ajouter_dependance(3);p8.ajouter_dependance(5);p8.ajouter_dependance(14);
58 francois 1110 p9.ajouter_dependance(1),p9.ajouter_dependance(3);p9.ajouter_dependance(5);p9.ajouter_dependance(11);p9.ajouter_dependance(12);
59 francois 896 lst.push_back(p1);
60     lst.push_back(p2);
61     lst.push_back(p3);
62     lst.push_back(p4);
63     lst.push_back(p5);
64     lst.push_back(p6);
65 francois 900 lst.push_back(p7);
66     lst.push_back(p8);
67 francois 1110 lst.push_back(p9);
68     lst.push_back(p10);
69     lst.push_back(p11);
70 francois 1117 lst.push_back(p12);
71     lst.push_back(p13);
72 francois 1108 MAGIC_APPLICATION app((char*)"Fast Marching Application",argc,argv,lst,true,false);
73 francois 896 if (app.get_erreur()==true) return 0;
74     if (app.get_action()==2)
75     {
76     char fichiermagic[500];
77     char entite[5000];
78     int numsol=0;
79     int nummai=0;
80     int numchamp=1;
81 francois 1051 app.recupere_parametre_string(1,fichiermagic,(char*)"Fichier MAGIC entrant manquant",MAGIC_APPLICATION::VERIFFICHIEREXISTE);
82 francois 896 app.recupere_parametre_int_avec_defaut(4,numsol,0);
83     app.recupere_parametre_int_avec_defaut(5,nummai,0);
84 francois 1117 app.recupere_parametre_int_avec_defaut(6,numchamp,0);;
85 francois 896 app.recupere_parametre_string(7,entite,(char*)"pas de liste d'entité d'initialisation");
86     if (app.get_erreur()==true) return 0;
87 francois 1117 app.affiche((char*)"\n\nLecture du fichier");
88 francois 896 MG_FILE gest(fichiermagic);
89     FEM_SOLUTION* sol=NULL;
90     char chaine[500];
91 francois 1075 char chaine2[5000];
92 francois 896 char *p=strrchr(fichiermagic,'.');
93     strncpy(chaine,fichiermagic,p-fichiermagic);
94     if ((numsol==0) && (nummai==0)) sol=gest.get_fem_solution(0);
95     else if (numsol!=0) sol=gest.get_fem_solutionid(numsol);
96     if (sol==NULL)
97     {
98     FEM_MAILLAGE* fem=NULL;
99     if (nummai==0) fem=gest.get_fem_maillage(0); else fem=gest.get_fem_maillageid(nummai);
100     sprintf(chaine2,"%s%d_fm.sol",chaine,gest.get_nb_fem_solution());
101     sol=new FEM_SOLUTION(fem,1,chaine2,1,"Distance");
102     gest.ajouter_fem_solution(sol);
103     numchamp=0;
104     }
105 francois 1117 app.affiche((char*)"Initialisation fast marching");
106     MAGIC::MG_FAST_MARCHING2D fm(sol,numchamp);
107 francois 1108 //fm.init(MAGIC::VERSION_GRADT_TRI_SETHIAN,MAGIC::VERSION_CONSERVE_DISTANCE);
108     fm.init();
109 francois 896 fm.init_noeud(entite);
110 francois 1117 app.affiche((char*)"Fast marching");
111 francois 896 fm.propage(1.0);
112     fm.finalise();
113 francois 1117 app.affiche((char*)"Enregistrement");
114 francois 896 MG_EXPORT exp;
115     exp.gmsh(sol->get_maillage(),chaine);
116     gest.enregistrer(fichiermagic);
117     }
118    
119 francois 900 if ((app.get_action()==8) || (app.get_action()==9))
120     {
121     char fichiermagic[500];
122     char entite[5000];
123     int nummai=0;
124 francois 1051 app.recupere_parametre_string(1,fichiermagic,(char*)"Fichier MAGIC entrant manquant",MAGIC_APPLICATION::VERIFFICHIEREXISTE);
125 francois 900 app.recupere_parametre_int_avec_defaut(5,nummai,0);
126 francois 1117 if (app.get_action()==8) app.recupere_parametre_string(13,entite,(char*)"pas de liste d'entité d'initialisation");
127     if (app.get_action()==9) app.recupere_parametre_string(14,entite,(char*)"pas de liste d'entité d'initialisation");
128 francois 900 if (app.get_erreur()==true) return 0;
129 francois 1117 app.affiche((char*)"\n\nLecture du fichier");
130 francois 900 MG_FILE gest(fichiermagic);
131     char chaine[1000];for (int i=0;i<1000;i++) chaine[i]=0;
132     char *p=strrchr(fichiermagic,'.');
133     strncpy(chaine,fichiermagic,p-fichiermagic);
134 francois 1019 FEM_MAILLAGE *fem;
135     if (nummai==0) fem=gest.get_fem_maillage(0); else fem=gest.get_fem_maillageid(nummai);
136 francois 1117 if (fem==NULL)
137     {
138     app.affiche((char*)" Pas de maillage FEM");
139     return 0;
140     }
141     app.affiche((char*)"Initialisation geodesique");
142 francois 1019 MAGIC::MG_GEODESIC geod(chaine,&gest,fem);
143 francois 1117 geod.active_affichage(app.affiche);
144 francois 900 bool ok;
145     if (app.get_action()==8) ok=geod.init_noeud(entite);
146     if (app.get_action()==9) ok=geod.init_coord(entite);
147     if (ok==false)
148     {
149 francois 1117 app.affiche_erreur((char*)" Initialisation incorrecte");
150 francois 900 }
151     else
152     {
153 francois 1117 app.affiche((char*)"Calcul geodesique");
154 francois 1019 double tab[3];
155     double val=geod.calcul(tab);
156 francois 900 char mess[500];
157 francois 1117 sprintf(mess," La longueur calculée est \033[1;31m%lf\033[1;33m",val);
158 francois 1110 app.affiche(mess);
159 francois 1117 sprintf(mess," basée sur deux fast marching de \033[1;31m%lf\033[1;33m et \033[1;31m%lf\033[1;33m ",tab[0],tab[1]);
160     app.affiche(mess);
161     app.affiche((char*)"Enregistrement");
162 francois 900 MG_EXPORT exp;
163 francois 1019 exp.gmsh(fem,chaine);
164 francois 900 gest.enregistrer(fichiermagic);
165     }
166     }
167 francois 1110 if (app.get_action()==10)
168     {
169     char fichiermagic[500];
170     char fichierliste[500];
171     char fichiermat[500];
172     int nummai=0;
173     app.recupere_parametre_string(1,fichiermagic,(char*)"Fichier MAGIC entrant manquant",MAGIC_APPLICATION::VERIFFICHIEREXISTE);
174     app.recupere_parametre_int_avec_defaut(5,nummai,0);
175     app.recupere_parametre_string(11,fichierliste,(char*)"Pas de fichier de liste de points",MAGIC_APPLICATION::VERIFFICHIEREXISTE);
176     app.recupere_parametre_string(12,fichiermat,(char*)"Pas de fichier de liste de points");
177     if (app.get_erreur()==true) return 0;
178 francois 1117 app.affiche((char*)"\n\nLecture des fichiers");
179     app.affiche((char*)" fichier magic");
180 francois 1110 MG_FILE gest(fichiermagic);
181     char chaine[1000];for (int i=0;i<1000;i++) chaine[i]=0;char chaine2[1000];
182     char *p=strrchr(fichiermagic,'.');
183     strncpy(chaine,fichiermagic,p-fichiermagic);
184     FEM_MAILLAGE *fem;
185     if (nummai==0) fem=gest.get_fem_maillage(0); else fem=gest.get_fem_maillageid(nummai);
186     std::vector<double> lst;
187     int nb;
188 francois 1117 app.affiche((char*)" fichier points");
189 francois 1110 FILE *in =fopen(fichierliste,"rt");
190     fgets(chaine2,1000,in);
191     sscanf(chaine2,"%d",&nb);
192     for (int i=0;i<nb;i++)
193     {
194     fgets(chaine2,1000,in);
195     double x,y,z;
196     sscanf(chaine2,"%lf %lf %lf",&x,&y,&z);
197     lst.push_back(x);
198     lst.push_back(y);
199     lst.push_back(z);
200     }
201     fclose(in);
202 francois 1117 app.affiche((char*)"Initialisation geodesique");
203 francois 1110 MAGIC::MG_GEODESIC geod(chaine,&gest,fem,nb);
204 francois 1120 //geod.active_affichage(app.affiche);
205 francois 1110 double *mat=new double[nb*nb];
206 francois 1117 app.affiche((char*)"Calcul ensemble des geodesiques");
207 francois 1110 geod.calcul_reseau(lst,mat);
208 francois 1117 app.affiche((char*)"Enregistrement matrice des distances");
209 francois 1110 FILE *out =fopen(fichiermat,"wt");
210     for (int i=0;i<nb;i++)
211     {
212     for (int j=0;j<nb;j++)
213     fprintf(out,"%lf ",mat[i*nb+j]);
214     fprintf(out,"\n");
215     }
216    
217    
218     fclose(out);
219    
220     }
221 francois 896
222 francois 1117 app.affiche((char*)"Fin");
223    
224 francois 896
225    
226     /*
227    
228    
229    
230    
231     MG_FILE gest((char*)"/home/francois/dev/magic/cas_debug/fm/plaquetroueemaille.magic");
232     FEM_SOLUTION* sol=gest.get_fem_solution(0);
233     if (sol==NULL)
234     {
235     FEM_MAILLAGE* fem=gest.get_fem_maillage(0);
236     sol=new FEM_SOLUTION(fem,4,(char*)"plaquetrouee.sol",1,"Distance");
237     gest.ajouter_fem_solution(sol);
238     }
239     std::vector<FEM_NOEUD*> lst;
240     lst.push_back((FEM_NOEUD*)gest.get_mg_geometrie(0)->get_mg_sommetid(25)->get_lien_fem_maillage()->get(0));
241     std::cout << "LS1" << std::endl;
242     MAGIC::MG_FAST_MARCHING fm(sol,0);
243     fm.init(MAGIC::VERSION_GRADT_TRI_SETHIAN,MAGIC::VERSION_CONSERVE_DISTANCE);
244     fm.init_noeud(lst);
245     fm.propage(1.0);
246     fm.finalise();
247     sol->active_solution(0);
248     double val1=((FEM_NOEUD*)gest.get_mg_geometrie(0)->get_mg_sommetid(34)->get_lien_fem_maillage()->get(0))->get_solution();
249     std::cout << " Distance " << val1 << std::endl;
250     std::vector<FEM_NOEUD*> lst2;
251     lst2.push_back((FEM_NOEUD*)gest.get_mg_geometrie(0)->get_mg_sommetid(34)->get_lien_fem_maillage()->get(0));
252     std::cout << "LS2" << std::endl;
253     MAGIC::MG_FAST_MARCHING fm2(sol,1);
254     fm2.init(MAGIC::VERSION_GRADT_TRI_SETHIAN,MAGIC::VERSION_CONSERVE_DISTANCE);
255     fm2.init_noeud(lst2);
256     fm2.propage(1.0);
257     fm2.finalise();
258     sol->active_solution(1);
259     double val2=((FEM_NOEUD*)gest.get_mg_geometrie(0)->get_mg_sommetid(25)->get_lien_fem_maillage()->get(0))->get_solution();
260     std::cout << " Distance " << val2 << std::endl;
261     FEM_MAILLAGE_OUTILS ot;
262     std::cout << "+" << std::endl;
263     ot.operation_champs_solution(sol,0,sol,1,sol,2,MAGIC::OPERATION_FEM_SOLUTION::ADDITION);
264     std::cout << "-" << std::endl;
265     ot.operation_champs_solution(sol,0,sol,1,sol,3,MAGIC::OPERATION_FEM_SOLUTION::SOUSTRACTION);
266    
267    
268     MG_EXPORT exp;
269     exp.gmsh(sol->get_maillage(),"distance");
270     gest.enregistrer((char*)"/home/francois/dev/magic/cas_debug/fm/plaquetroueemaille.magic");*/
271     }
272    
273    
274    
275    
276    
277    
278    
279    
280    
281    
282    
283    
284    
285    
286 francois 1051