ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/app/calculs/src/main2.cpp
Revision: 1110
Committed: Mon Mar 13 20:14:27 2023 UTC (2 years, 6 months ago) by francois
File size: 10321 byte(s)
Log Message:
Calcul de geodesic entre un reseau de point sur une surface

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     #include "mg_fast_marching.h"
35     #include "fem_maillage_outils.h"
36     #include "mg_export.h"
37     //---------------------------------------------------------------------------
38    
39    
40    
41    
42     int main(int argc,char **argv)
43     {
44     std::vector<MAGIC_PARAMETRE_APPLICATION> lst;
45     MAGIC_PARAMETRE_APPLICATION p1(2,(char*)"-fm2",MAGIC_PARAMETRE_APPLICATION::ACTION,(char*)"Fast marching sur une face");
46     MAGIC_PARAMETRE_APPLICATION p2(3,(char*)"-num",MAGIC_PARAMETRE_APPLICATION::INTEGER,(char*)"Id de la face à calculer");
47     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)");
48     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)");
49     MAGIC_PARAMETRE_APPLICATION p5(6,(char*)"-numchamp",MAGIC_PARAMETRE_APPLICATION::INTEGER,(char*)"Numero du champ dans la solution (defaut le premier)");
50 francois 900 MAGIC_PARAMETRE_APPLICATION p6(7,(char*)"-init",MAGIC_PARAMETRE_APPLICATION::STRING,(char*)"Liste des entités initialisées à 0 sous la forme id1,id2,id3... ou x,y,z,x,y,z");
51     MAGIC_PARAMETRE_APPLICATION p7(8,(char*)"-geodesic",MAGIC_PARAMETRE_APPLICATION::ACTION,(char*)"Fast marching pour calculer la geodesic entre deux sommets sur une face");
52     MAGIC_PARAMETRE_APPLICATION p8(9,(char*)"-geodesic2",MAGIC_PARAMETRE_APPLICATION::ACTION,(char*)"Fast marching pour calculer la geodesic entre deux points sur une face");
53 francois 1110 MAGIC_PARAMETRE_APPLICATION p9(10,(char*)"-geodesic3",MAGIC_PARAMETRE_APPLICATION::ACTION,(char*)"Fast marching pour calculer la geodesic entre une liste de points sur une face");
54     MAGIC_PARAMETRE_APPLICATION p10(11,(char*)"-fichierliste",MAGIC_PARAMETRE_APPLICATION::STRING,(char*)"Nom du fichier de la liste de points ");
55     MAGIC_PARAMETRE_APPLICATION p11(12,(char*)"-fichiermat",MAGIC_PARAMETRE_APPLICATION::STRING,(char*)"Nom du fichier de la matrice des distances ");
56 francois 896
57     p1.ajouter_dependance(1),p1.ajouter_dependance(3);p1.ajouter_dependance(4);p1.ajouter_dependance(5);p1.ajouter_dependance(6);p1.ajouter_dependance(7);
58 francois 1019 p7.ajouter_dependance(1),p7.ajouter_dependance(3);p7.ajouter_dependance(5);p7.ajouter_dependance(7);
59     p8.ajouter_dependance(1),p8.ajouter_dependance(3);p8.ajouter_dependance(5);p8.ajouter_dependance(7);
60 francois 1110 p9.ajouter_dependance(1),p9.ajouter_dependance(3);p9.ajouter_dependance(5);p9.ajouter_dependance(11);p9.ajouter_dependance(12);
61 francois 896 lst.push_back(p1);
62     lst.push_back(p2);
63     lst.push_back(p3);
64     lst.push_back(p4);
65     lst.push_back(p5);
66     lst.push_back(p6);
67 francois 900 lst.push_back(p7);
68     lst.push_back(p8);
69 francois 1110 lst.push_back(p9);
70     lst.push_back(p10);
71     lst.push_back(p11);
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     app.recupere_parametre_int_avec_defaut(6,numchamp,0);numchamp--;
85     app.recupere_parametre_string(7,entite,(char*)"pas de liste d'entité d'initialisation");
86     if (app.get_erreur()==true) return 0;
87    
88     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     MAGIC::MG_FAST_MARCHING fm(sol,numchamp);
106 francois 1108 //fm.init(MAGIC::VERSION_GRADT_TRI_SETHIAN,MAGIC::VERSION_CONSERVE_DISTANCE);
107     fm.init();
108 francois 896 fm.init_noeud(entite);
109     fm.propage(1.0);
110     fm.finalise();
111     MG_EXPORT exp;
112     exp.gmsh(sol->get_maillage(),chaine);
113     gest.enregistrer(fichiermagic);
114     }
115    
116 francois 900 if ((app.get_action()==8) || (app.get_action()==9))
117     {
118     char fichiermagic[500];
119     char entite[5000];
120     int nummai=0;
121 francois 1051 app.recupere_parametre_string(1,fichiermagic,(char*)"Fichier MAGIC entrant manquant",MAGIC_APPLICATION::VERIFFICHIEREXISTE);
122 francois 900 app.recupere_parametre_int_avec_defaut(5,nummai,0);
123     app.recupere_parametre_string(7,entite,(char*)"pas de liste d'entité d'initialisation");
124     if (app.get_erreur()==true) return 0;
125    
126     MG_FILE gest(fichiermagic);
127     char chaine[1000];for (int i=0;i<1000;i++) chaine[i]=0;
128     char *p=strrchr(fichiermagic,'.');
129     strncpy(chaine,fichiermagic,p-fichiermagic);
130 francois 1019 FEM_MAILLAGE *fem;
131     if (nummai==0) fem=gest.get_fem_maillage(0); else fem=gest.get_fem_maillageid(nummai);
132     MAGIC::MG_GEODESIC geod(chaine,&gest,fem);
133 francois 900 bool ok;
134     if (app.get_action()==8) ok=geod.init_noeud(entite);
135     if (app.get_action()==9) ok=geod.init_coord(entite);
136     if (ok==false)
137     {
138     app.affiche_erreur((char*)"Initialisation incorrecte");
139     }
140     else
141     {
142 francois 1019 double tab[3];
143     double val=geod.calcul(tab);
144 francois 900 char mess[500];
145     sprintf(mess,"La longueur calculée est %lf",val);
146 francois 1110 app.affiche(mess);
147 francois 900 MG_EXPORT exp;
148 francois 1019 exp.gmsh(fem,chaine);
149 francois 900 gest.enregistrer(fichiermagic);
150     }
151     }
152 francois 1110 if (app.get_action()==10)
153     {
154     char fichiermagic[500];
155     char fichierliste[500];
156     char fichiermat[500];
157     int nummai=0;
158     app.recupere_parametre_string(1,fichiermagic,(char*)"Fichier MAGIC entrant manquant",MAGIC_APPLICATION::VERIFFICHIEREXISTE);
159     app.recupere_parametre_int_avec_defaut(5,nummai,0);
160     app.recupere_parametre_string(11,fichierliste,(char*)"Pas de fichier de liste de points",MAGIC_APPLICATION::VERIFFICHIEREXISTE);
161     app.recupere_parametre_string(12,fichiermat,(char*)"Pas de fichier de liste de points");
162     if (app.get_erreur()==true) return 0;
163    
164     MG_FILE gest(fichiermagic);
165     char chaine[1000];for (int i=0;i<1000;i++) chaine[i]=0;char chaine2[1000];
166     char *p=strrchr(fichiermagic,'.');
167     strncpy(chaine,fichiermagic,p-fichiermagic);
168     FEM_MAILLAGE *fem;
169     if (nummai==0) fem=gest.get_fem_maillage(0); else fem=gest.get_fem_maillageid(nummai);
170     std::vector<double> lst;
171     int nb;
172     FILE *in =fopen(fichierliste,"rt");
173     fgets(chaine2,1000,in);
174     sscanf(chaine2,"%d",&nb);
175     for (int i=0;i<nb;i++)
176     {
177     fgets(chaine2,1000,in);
178     double x,y,z;
179     sscanf(chaine2,"%lf %lf %lf",&x,&y,&z);
180     lst.push_back(x);
181     lst.push_back(y);
182     lst.push_back(z);
183     }
184     fclose(in);
185     MAGIC::MG_GEODESIC geod(chaine,&gest,fem,nb);
186     double *mat=new double[nb*nb];
187     geod.calcul_reseau(lst,mat);
188     FILE *out =fopen(fichiermat,"wt");
189     for (int i=0;i<nb;i++)
190     {
191     for (int j=0;j<nb;j++)
192     fprintf(out,"%lf ",mat[i*nb+j]);
193     fprintf(out,"\n");
194     }
195    
196    
197     fclose(out);
198    
199     }
200 francois 896
201    
202    
203 francois 900
204 francois 896 /*
205    
206    
207    
208    
209     MG_FILE gest((char*)"/home/francois/dev/magic/cas_debug/fm/plaquetroueemaille.magic");
210     FEM_SOLUTION* sol=gest.get_fem_solution(0);
211     if (sol==NULL)
212     {
213     FEM_MAILLAGE* fem=gest.get_fem_maillage(0);
214     sol=new FEM_SOLUTION(fem,4,(char*)"plaquetrouee.sol",1,"Distance");
215     gest.ajouter_fem_solution(sol);
216     }
217     std::vector<FEM_NOEUD*> lst;
218     lst.push_back((FEM_NOEUD*)gest.get_mg_geometrie(0)->get_mg_sommetid(25)->get_lien_fem_maillage()->get(0));
219     std::cout << "LS1" << std::endl;
220     MAGIC::MG_FAST_MARCHING fm(sol,0);
221     fm.init(MAGIC::VERSION_GRADT_TRI_SETHIAN,MAGIC::VERSION_CONSERVE_DISTANCE);
222     fm.init_noeud(lst);
223     fm.propage(1.0);
224     fm.finalise();
225     sol->active_solution(0);
226     double val1=((FEM_NOEUD*)gest.get_mg_geometrie(0)->get_mg_sommetid(34)->get_lien_fem_maillage()->get(0))->get_solution();
227     std::cout << " Distance " << val1 << std::endl;
228     std::vector<FEM_NOEUD*> lst2;
229     lst2.push_back((FEM_NOEUD*)gest.get_mg_geometrie(0)->get_mg_sommetid(34)->get_lien_fem_maillage()->get(0));
230     std::cout << "LS2" << std::endl;
231     MAGIC::MG_FAST_MARCHING fm2(sol,1);
232     fm2.init(MAGIC::VERSION_GRADT_TRI_SETHIAN,MAGIC::VERSION_CONSERVE_DISTANCE);
233     fm2.init_noeud(lst2);
234     fm2.propage(1.0);
235     fm2.finalise();
236     sol->active_solution(1);
237     double val2=((FEM_NOEUD*)gest.get_mg_geometrie(0)->get_mg_sommetid(25)->get_lien_fem_maillage()->get(0))->get_solution();
238     std::cout << " Distance " << val2 << std::endl;
239     FEM_MAILLAGE_OUTILS ot;
240     std::cout << "+" << std::endl;
241     ot.operation_champs_solution(sol,0,sol,1,sol,2,MAGIC::OPERATION_FEM_SOLUTION::ADDITION);
242     std::cout << "-" << std::endl;
243     ot.operation_champs_solution(sol,0,sol,1,sol,3,MAGIC::OPERATION_FEM_SOLUTION::SOUSTRACTION);
244    
245    
246     MG_EXPORT exp;
247     exp.gmsh(sol->get_maillage(),"distance");
248     gest.enregistrer((char*)"/home/francois/dev/magic/cas_debug/fm/plaquetroueemaille.magic");*/
249     }
250    
251    
252    
253    
254    
255    
256    
257    
258    
259    
260    
261    
262    
263    
264 francois 1051