ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/app/calculs/src/main2.cpp
Revision: 1120
Committed: Thu Jun 29 23:05:00 2023 UTC (2 years, 3 months ago) by francois
File size: 11936 byte(s)
Log Message:
encore une precision

File Contents

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