ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/fichier/src/mg_table.cpp
Revision: 698
Committed: Tue Jul 28 23:04:28 2015 UTC (9 years, 9 months ago) by francois
File size: 10664 byte(s)
Log Message:
ajout d'un filtre de topologie pour la creation de table

File Contents

# User Rev Content
1 francois 697 //---------------------------------------------------------------------------
2    
3     #include "gestionversion.h"
4     #include "mg_table.h"
5     #include "mg_gestionnaire.h"
6    
7    
8    
9    
10    
11     MG_TABLE::MG_TABLE()
12     {
13     }
14    
15     MG_TABLE::~MG_TABLE()
16     {
17     }
18    
19    
20    
21     std::string MG_TABLE::info_noeud(FEM_MAILLAGE *fem, FEM_NOEUD* no)
22     {
23     LISTE_FEM_NOEUD::iterator it;
24     int numno=0;
25     for (FEM_NOEUD *notmp=fem->get_premier_noeud(it);notmp!=NULL;notmp=fem->get_suivant_noeud(it))
26     {
27     if (notmp==no) break;
28     numno++;
29     }
30     return info_noeud(fem,no,numno,true);
31    
32     }
33    
34 francois 698 void MG_TABLE::info_noeud(FEM_MAILLAGE *fem,char *nomfichier,MG_ELEMENT_TOPOLOGIQUE *topo)
35 francois 697 {
36     FILE* in=fopen(nomfichier,"wt");
37     LISTE_FEM_NOEUD::iterator it;
38     int numno=0;
39     std::string chaine;
40     for (FEM_NOEUD *notmp=fem->get_premier_noeud(it);notmp!=NULL;notmp=fem->get_suivant_noeud(it))
41     {
42 francois 698 static bool first=true;
43     if ((topo!=NULL) && (notmp->get_lien_topologie()!=topo)) {numno++;continue;}
44     if (first) chaine=info_noeud(fem,notmp,numno,true);
45 francois 697 else chaine=info_noeud(fem,notmp,numno,false);
46     fprintf(in,"%s\n",chaine.c_str());
47     numno++;
48 francois 698 first=false;
49 francois 697 }
50     fclose(in);
51    
52     }
53    
54     std::string MG_TABLE::info_noeud(FEM_MAILLAGE *fem, FEM_NOEUD* no,int numno,bool avectitre)
55     {
56     MG_GESTIONNAIRE *gest=fem->get_mg_maillage()->get_gestionnaire();
57     std::string titre="Num;Id;x;y;z;";
58     char chaine[255];
59     sprintf(chaine,"%d;%lu;%le;%le;%le;",numno+1,no->get_id(),no->get_x(),no->get_y(),no->get_z());
60     std::string valeur=chaine;
61     LISTE_FEM_SOLUTION::iterator its;
62     for (FEM_SOLUTION* sol=gest->get_premier_fem_solution(its);sol!=NULL;sol=gest->get_suivant_fem_solution(its))
63     {
64     if (sol->get_entite_solution()!=MAGIC::ENTITE_SOLUTION::ENTITE_NOEUD) continue;
65     int dim=sol->get_dim_solution();
66     int nb_champs=sol->get_nb_champ();
67     for (int j=0;j<nb_champs;j++)
68     {
69     string nom=sol->get_nom()+ "_" + sol->get_legende(j);
70     int timestep=0;
71     bool avectimestep=false;
72     for (int k=0;k<nom.length();k++)
73     {
74     if (nom[k]==' ') nom[k]='_';
75     if (nom[k]=='%') {nom[k]=' ';avectimestep=true;}
76     }
77     if (avectimestep)
78     {
79     char message[500];
80     sscanf(nom.c_str(),"%s %d",message,&timestep);
81     nom=message;
82     nom=nom+ "_" + sol->get_legende(j);
83     sprintf(message,"%d",timestep);
84     nom=nom+"_"+"T"+message;
85     }
86     if (MAGIC::TYPE_SOLUTION::SCALAIRE==1)
87     {
88     if (avectitre) titre=titre+nom+";";
89     double val=sol->lire(numno,j);
90     sprintf(chaine,"%le;",val);
91     valeur=valeur+chaine;
92     }
93     if (dim==MAGIC::TYPE_SOLUTION::VECTEUR)
94     {
95     if (avectitre) titre=titre+nom+"_x;"+nom+"_y;"+nom+"_z;";
96     double val1=sol->lire(numno,j,0);
97     double val2=sol->lire(numno,j,1);
98     double val3=sol->lire(numno,j,2);
99     sprintf(chaine,"%le;%le;%le;",val1,val2,val3);
100     valeur=valeur+chaine;
101     }
102     }
103     }
104    
105     if (avectitre)
106     return titre+"\n"+valeur;
107     return valeur;
108    
109    
110     }
111    
112    
113    
114    
115     std::string MG_TABLE::info_element1(FEM_MAILLAGE *fem, FEM_ELEMENT1* ele)
116     {
117     LISTE_FEM_ELEMENT1::iterator it;
118     int num=0;
119     for (FEM_ELEMENT1 *eletmp=fem->get_premier_element1(it);eletmp!=NULL;eletmp=fem->get_suivant_element1(it))
120     {
121     if (eletmp==ele) break;
122     num++;
123     }
124     return info_element1(fem,ele,num,true);
125    
126     }
127    
128 francois 698 void MG_TABLE::info_element1(FEM_MAILLAGE *fem,char *nomfichier,MG_ELEMENT_TOPOLOGIQUE *topo)
129 francois 697 {
130     FILE* in=fopen(nomfichier,"wt");
131     LISTE_FEM_ELEMENT1::iterator it;
132     int num=0;
133     std::string chaine;
134     for (FEM_ELEMENT1 *eletmp=fem->get_premier_element1(it);eletmp!=NULL;eletmp=fem->get_suivant_element1(it))
135     {
136 francois 698 static bool first=true;
137     if ((topo!=NULL) && (eletmp->get_lien_topologie()!=topo)) {num++;continue;}
138     if (first) chaine=info_element1(fem,eletmp,num,true);
139 francois 697 else chaine=info_element1(fem,eletmp,num,false);
140     fprintf(in,"%s\n",chaine.c_str());
141     num++;
142 francois 698 first=false;
143 francois 697 }
144     fclose(in);
145    
146     }
147    
148     std::string MG_TABLE::info_element1(FEM_MAILLAGE *fem, FEM_ELEMENT1* ele,int numno,bool avectitre)
149     {
150     MG_GESTIONNAIRE *gest=fem->get_mg_maillage()->get_gestionnaire();
151     std::string titre="Num;Id;";
152     char chaine[255];
153     sprintf(chaine,"%d;%lu;",numno+1,ele->get_id());
154     std::string valeur=chaine;
155     LISTE_FEM_SOLUTION::iterator its;
156     for (FEM_SOLUTION* sol=gest->get_premier_fem_solution(its);sol!=NULL;sol=gest->get_suivant_fem_solution(its))
157     {
158     if (sol->get_entite_solution()!=MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3) continue;
159     int dim=sol->get_dim_solution();
160     int nb_champs=sol->get_nb_champ();
161     for (int j=0;j<nb_champs;j++)
162     {
163     string nom=sol->get_nom()+ "_" + sol->get_legende(j);
164     int timestep=0;
165     bool avectimestep=false;
166     for (int k=0;k<nom.length();k++)
167     {
168     if (nom[k]==' ') nom[k]='_';
169     if (nom[k]=='%') {nom[k]=' ';avectimestep=true;}
170     }
171     if (avectimestep)
172     {
173     char message[500];
174     sscanf(nom.c_str(),"%s %d",message,&timestep);
175     nom=message;
176     nom=nom+ "_" + sol->get_legende(j);
177     sprintf(message,"%d",timestep);
178     nom=nom+"_"+"T"+message;
179     }
180     if (dim==MAGIC::TYPE_SOLUTION::SCALAIRE)
181     {
182     if (avectitre) titre=titre+nom+";";
183     double val=sol->lire(numno,j);
184     sprintf(chaine,"%le;",val);
185     valeur=valeur+chaine;
186     }
187     if (dim==MAGIC::TYPE_SOLUTION::VECTEUR)
188     {
189     if (avectitre) titre=titre+nom+"_x;"+nom+"_y;"+nom+"_z;";
190     double val1=sol->lire(numno,j,0);
191     double val2=sol->lire(numno,j,1);
192     double val3=sol->lire(numno,j,2);
193     sprintf(chaine,"%le;%le;%le;",val1,val2,val3);
194     valeur=valeur+chaine;
195     }
196     }
197     }
198    
199     if (avectitre)
200     return titre+"\n"+valeur;
201     return valeur;
202    
203    
204     }
205    
206    
207    
208    
209    
210     std::string MG_TABLE::info_element2(FEM_MAILLAGE *fem, FEM_ELEMENT2* ele)
211     {
212     LISTE_FEM_ELEMENT2::iterator it;
213     int num=0;
214     for (FEM_ELEMENT2 *eletmp=fem->get_premier_element2(it);eletmp!=NULL;eletmp=fem->get_suivant_element2(it))
215     {
216     if (eletmp==ele) break;
217     num++;
218     }
219     return info_element2(fem,ele,num,true);
220    
221     }
222    
223 francois 698 void MG_TABLE::info_element2(FEM_MAILLAGE *fem,char *nomfichier,MG_ELEMENT_TOPOLOGIQUE *topo)
224 francois 697 {
225     FILE* in=fopen(nomfichier,"wt");
226     LISTE_FEM_ELEMENT2::iterator it;
227     int num=0;
228     std::string chaine;
229     for (FEM_ELEMENT2 *eletmp=fem->get_premier_element2(it);eletmp!=NULL;eletmp=fem->get_suivant_element2(it))
230     {
231 francois 698 static bool first=true;
232     if ((topo!=NULL) && (eletmp->get_lien_topologie()!=topo)) {num++;continue;}
233     if (first) chaine=info_element2(fem,eletmp,num,true);
234 francois 697 else chaine=info_element2(fem,eletmp,num,false);
235     fprintf(in,"%s\n",chaine.c_str());
236     num++;
237 francois 698 first=false;
238     }
239 francois 697 fclose(in);
240    
241     }
242    
243     std::string MG_TABLE::info_element2(FEM_MAILLAGE *fem, FEM_ELEMENT2* ele,int numno,bool avectitre)
244     {
245     MG_GESTIONNAIRE *gest=fem->get_mg_maillage()->get_gestionnaire();
246     std::string titre="Num;Id;";
247     char chaine[255];
248     sprintf(chaine,"%d;%lu;",numno+1,ele->get_id());
249     std::string valeur=chaine;
250     LISTE_FEM_SOLUTION::iterator its;
251     for (FEM_SOLUTION* sol=gest->get_premier_fem_solution(its);sol!=NULL;sol=gest->get_suivant_fem_solution(its))
252     {
253     if (sol->get_entite_solution()!=MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2) continue;
254     int dim=sol->get_dim_solution();
255     int nb_champs=sol->get_nb_champ();
256     for (int j=0;j<nb_champs;j++)
257     {
258     string nom=sol->get_nom()+ "_" + sol->get_legende(j);
259     int timestep=0;
260     bool avectimestep=false;
261     for (int k=0;k<nom.length();k++)
262     {
263     if (nom[k]==' ') nom[k]='_';
264     if (nom[k]=='%') {nom[k]=' ';avectimestep=true;}
265     }
266     if (avectimestep)
267     {
268     char message[500];
269     sscanf(nom.c_str(),"%s %d",message,&timestep);
270     nom=message;
271     nom=nom+ "_" + sol->get_legende(j);
272     sprintf(message,"%d",timestep);
273     nom=nom+"_"+"T"+message;
274     }
275     if (dim==MAGIC::TYPE_SOLUTION::SCALAIRE)
276     {
277     if (avectitre) titre=titre+nom+";";
278     double val=sol->lire(numno,j);
279     sprintf(chaine,"%le;",val);
280     valeur=valeur+chaine;
281     }
282     if (dim==MAGIC::TYPE_SOLUTION::VECTEUR)
283     {
284     if (avectitre) titre=titre+nom+"_x;"+nom+"_y;"+nom+"_z;";
285     double val1=sol->lire(numno,j,0);
286     double val2=sol->lire(numno,j,1);
287     double val3=sol->lire(numno,j,2);
288     sprintf(chaine,"%le;%le;%le;",val1,val2,val3);
289     valeur=valeur+chaine;
290     }
291     }
292     }
293    
294     if (avectitre)
295     return titre+"\n"+valeur;
296     return valeur;
297    
298    
299     }
300    
301    
302    
303    
304     std::string MG_TABLE::info_element3(FEM_MAILLAGE *fem, FEM_ELEMENT3* ele)
305     {
306     LISTE_FEM_ELEMENT3::iterator it;
307     int num=0;
308     for (FEM_ELEMENT3 *eletmp=fem->get_premier_element3(it);eletmp!=NULL;eletmp=fem->get_suivant_element3(it))
309     {
310     if (eletmp==ele) break;
311     num++;
312     }
313     return info_element3(fem,ele,num,true);
314    
315     }
316    
317 francois 698 void MG_TABLE::info_element3(FEM_MAILLAGE *fem,char *nomfichier,MG_ELEMENT_TOPOLOGIQUE *topo)
318 francois 697 {
319     FILE* in=fopen(nomfichier,"wt");
320     LISTE_FEM_ELEMENT3::iterator it;
321     int num=0;
322     std::string chaine;
323     for (FEM_ELEMENT3 *eletmp=fem->get_premier_element3(it);eletmp!=NULL;eletmp=fem->get_suivant_element3(it))
324     {
325 francois 698 static bool first=true;
326     if ((topo!=NULL) && (eletmp->get_lien_topologie()!=topo)) {num++;continue;}
327     if (first) chaine=info_element3(fem,eletmp,num,true);
328 francois 697 else chaine=info_element3(fem,eletmp,num,false);
329     fprintf(in,"%s\n",chaine.c_str());
330     num++;
331 francois 698 first=false;
332     }
333 francois 697 fclose(in);
334    
335     }
336    
337     std::string MG_TABLE::info_element3(FEM_MAILLAGE *fem, FEM_ELEMENT3* ele,int numno,bool avectitre)
338     {
339     MG_GESTIONNAIRE *gest=fem->get_mg_maillage()->get_gestionnaire();
340     std::string titre="Num;Id;";
341     char chaine[255];
342     sprintf(chaine,"%d;%lu;",numno+1,ele->get_id());
343     std::string valeur=chaine;
344     LISTE_FEM_SOLUTION::iterator its;
345     for (FEM_SOLUTION* sol=gest->get_premier_fem_solution(its);sol!=NULL;sol=gest->get_suivant_fem_solution(its))
346     {
347     if (sol->get_entite_solution()!=MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3) continue;
348     int dim=sol->get_dim_solution();
349     int nb_champs=sol->get_nb_champ();
350     for (int j=0;j<nb_champs;j++)
351     {
352     string nom=sol->get_nom()+ "_" + sol->get_legende(j);
353     int timestep=0;
354     bool avectimestep=false;
355     for (int k=0;k<nom.length();k++)
356     {
357     if (nom[k]==' ') nom[k]='_';
358     if (nom[k]=='%') {nom[k]=' ';avectimestep=true;}
359     }
360     if (avectimestep)
361     {
362     char message[500];
363     sscanf(nom.c_str(),"%s %d",message,&timestep);
364     nom=message;
365     nom=nom+ "_" + sol->get_legende(j);
366     sprintf(message,"%d",timestep);
367     nom=nom+"_"+"T"+message;
368     }
369     if (dim==MAGIC::TYPE_SOLUTION::SCALAIRE)
370     {
371     if (avectitre) titre=titre+nom+";";
372     double val=sol->lire(numno,j);
373     sprintf(chaine,"%le;",val);
374     valeur=valeur+chaine;
375     }
376     if (dim==MAGIC::TYPE_SOLUTION::VECTEUR)
377     {
378     if (avectitre) titre=titre+nom+"_x;"+nom+"_y;"+nom+"_z;";
379     double val1=sol->lire(numno,j,0);
380     double val2=sol->lire(numno,j,1);
381     double val3=sol->lire(numno,j,2);
382     sprintf(chaine,"%le;%le;%le;",val1,val2,val3);
383     valeur=valeur+chaine;
384     }
385     }
386     }
387    
388     if (avectitre)
389     return titre+"\n"+valeur;
390     return valeur;
391    
392    
393     }