ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/app/calculs/src/main2.cpp
Revision: 900
Committed: Thu Jul 20 13:30:07 2017 UTC (7 years, 10 months ago) by francois
File size: 7972 byte(s)
Log Message:
mise a jour calcul de geodesic

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 896
54     p1.ajouter_dependance(1),p1.ajouter_dependance(3);p1.ajouter_dependance(4);p1.ajouter_dependance(5);p1.ajouter_dependance(6);p1.ajouter_dependance(7);
55 francois 900 p7.ajouter_dependance(1),p7.ajouter_dependance(3);p7.ajouter_dependance(4);p7.ajouter_dependance(5);p7.ajouter_dependance(7);
56     p8.ajouter_dependance(1),p8.ajouter_dependance(3);p8.ajouter_dependance(4);p8.ajouter_dependance(5);p8.ajouter_dependance(7);
57 francois 896 lst.push_back(p1);
58     lst.push_back(p2);
59     lst.push_back(p3);
60     lst.push_back(p4);
61     lst.push_back(p5);
62     lst.push_back(p6);
63 francois 900 lst.push_back(p7);
64     lst.push_back(p8);
65 francois 896 MAGIC_APPLICATION app((char*)"Fast Marching",argc,argv,lst,true,false);
66     if (app.get_erreur()==true) return 0;
67     if (app.get_action()==2)
68     {
69     char fichiermagic[500];
70     char entite[5000];
71     int numsol=0;
72     int nummai=0;
73     int numchamp=1;
74     app.recupere_parametre_string(1,fichiermagic,(char*)"Fichier MAGIC entrant manquant");
75     app.recupere_parametre_int_avec_defaut(4,numsol,0);
76     app.recupere_parametre_int_avec_defaut(5,nummai,0);
77     app.recupere_parametre_int_avec_defaut(6,numchamp,0);numchamp--;
78     app.recupere_parametre_string(7,entite,(char*)"pas de liste d'entité d'initialisation");
79     if (app.get_erreur()==true) return 0;
80    
81     MG_FILE gest(fichiermagic);
82     FEM_SOLUTION* sol=NULL;
83     char chaine[500];
84     char chaine2[500];
85     char *p=strrchr(fichiermagic,'.');
86     strncpy(chaine,fichiermagic,p-fichiermagic);
87     if ((numsol==0) && (nummai==0)) sol=gest.get_fem_solution(0);
88     else if (numsol!=0) sol=gest.get_fem_solutionid(numsol);
89     if (sol==NULL)
90     {
91     FEM_MAILLAGE* fem=NULL;
92     if (nummai==0) fem=gest.get_fem_maillage(0); else fem=gest.get_fem_maillageid(nummai);
93     sprintf(chaine2,"%s%d_fm.sol",chaine,gest.get_nb_fem_solution());
94     sol=new FEM_SOLUTION(fem,1,chaine2,1,"Distance");
95     gest.ajouter_fem_solution(sol);
96     numchamp=0;
97     }
98     MAGIC::MG_FAST_MARCHING fm(sol,numchamp);
99     fm.init(MAGIC::VERSION_GRADT_TRI_SETHIAN,MAGIC::VERSION_CONSERVE_DISTANCE);
100     fm.init_noeud(entite);
101     fm.propage(1.0);
102     fm.finalise();
103     MG_EXPORT exp;
104     exp.gmsh(sol->get_maillage(),chaine);
105     gest.enregistrer(fichiermagic);
106     }
107    
108 francois 900 if ((app.get_action()==8) || (app.get_action()==9))
109     {
110     char fichiermagic[500];
111     char entite[5000];
112     int numsol=0;
113     int nummai=0;
114     app.recupere_parametre_string(1,fichiermagic,(char*)"Fichier MAGIC entrant manquant");
115     app.recupere_parametre_int_avec_defaut(4,numsol,0);
116     app.recupere_parametre_int_avec_defaut(5,nummai,0);
117     app.recupere_parametre_string(7,entite,(char*)"pas de liste d'entité d'initialisation");
118     if (app.get_erreur()==true) return 0;
119    
120     MG_FILE gest(fichiermagic);
121     FEM_SOLUTION* sol=NULL;
122     char chaine[1000];for (int i=0;i<1000;i++) chaine[i]=0;
123     char *p=strrchr(fichiermagic,'.');
124     strncpy(chaine,fichiermagic,p-fichiermagic);
125    
126     MAGIC::MG_GEODESIC geod(&sol,chaine,gest,numsol,nummai);
127     bool ok;
128     if (app.get_action()==8) ok=geod.init_noeud(entite);
129     if (app.get_action()==9) ok=geod.init_coord(entite);
130     if (ok==false)
131     {
132     app.affiche_erreur((char*)"Initialisation incorrecte");
133     }
134     else
135     {
136     double val=geod.calcul();
137     char mess[500];
138     sprintf(mess,"La longueur calculée est %lf",val);
139     app.affiche_erreur(mess);
140     MG_EXPORT exp;
141     exp.gmsh(sol->get_maillage(),chaine);
142     gest.enregistrer(fichiermagic);
143     }
144     }
145 francois 896
146    
147    
148 francois 900
149 francois 896 /*
150    
151    
152    
153    
154     MG_FILE gest((char*)"/home/francois/dev/magic/cas_debug/fm/plaquetroueemaille.magic");
155     FEM_SOLUTION* sol=gest.get_fem_solution(0);
156     if (sol==NULL)
157     {
158     FEM_MAILLAGE* fem=gest.get_fem_maillage(0);
159     sol=new FEM_SOLUTION(fem,4,(char*)"plaquetrouee.sol",1,"Distance");
160     gest.ajouter_fem_solution(sol);
161     }
162     std::vector<FEM_NOEUD*> lst;
163     lst.push_back((FEM_NOEUD*)gest.get_mg_geometrie(0)->get_mg_sommetid(25)->get_lien_fem_maillage()->get(0));
164     std::cout << "LS1" << std::endl;
165     MAGIC::MG_FAST_MARCHING fm(sol,0);
166     fm.init(MAGIC::VERSION_GRADT_TRI_SETHIAN,MAGIC::VERSION_CONSERVE_DISTANCE);
167     fm.init_noeud(lst);
168     fm.propage(1.0);
169     fm.finalise();
170     sol->active_solution(0);
171     double val1=((FEM_NOEUD*)gest.get_mg_geometrie(0)->get_mg_sommetid(34)->get_lien_fem_maillage()->get(0))->get_solution();
172     std::cout << " Distance " << val1 << std::endl;
173     std::vector<FEM_NOEUD*> lst2;
174     lst2.push_back((FEM_NOEUD*)gest.get_mg_geometrie(0)->get_mg_sommetid(34)->get_lien_fem_maillage()->get(0));
175     std::cout << "LS2" << std::endl;
176     MAGIC::MG_FAST_MARCHING fm2(sol,1);
177     fm2.init(MAGIC::VERSION_GRADT_TRI_SETHIAN,MAGIC::VERSION_CONSERVE_DISTANCE);
178     fm2.init_noeud(lst2);
179     fm2.propage(1.0);
180     fm2.finalise();
181     sol->active_solution(1);
182     double val2=((FEM_NOEUD*)gest.get_mg_geometrie(0)->get_mg_sommetid(25)->get_lien_fem_maillage()->get(0))->get_solution();
183     std::cout << " Distance " << val2 << std::endl;
184     FEM_MAILLAGE_OUTILS ot;
185     std::cout << "+" << std::endl;
186     ot.operation_champs_solution(sol,0,sol,1,sol,2,MAGIC::OPERATION_FEM_SOLUTION::ADDITION);
187     std::cout << "-" << std::endl;
188     ot.operation_champs_solution(sol,0,sol,1,sol,3,MAGIC::OPERATION_FEM_SOLUTION::SOUSTRACTION);
189    
190    
191     MG_EXPORT exp;
192     exp.gmsh(sol->get_maillage(),"distance");
193     gest.enregistrer((char*)"/home/francois/dev/magic/cas_debug/fm/plaquetroueemaille.magic");*/
194     }
195    
196    
197    
198    
199    
200    
201    
202    
203    
204    
205    
206    
207    
208    
209