ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/fichier/src/mg_table.cpp
Revision: 854
Committed: Fri Nov 4 20:23:46 2016 UTC (8 years, 6 months ago) by francois
File size: 21699 byte(s)
Log Message:
ajustement 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 francois 778 #include "ot_parametres.h"
7 francois 697
8    
9    
10    
11     MG_TABLE::MG_TABLE()
12     {
13 francois 778 OT_PARAMETRES param;
14     param.ajouter("Separateur_decimale",",",OT_PARAMETRES::STRING,"Seprateur décimale pour l'exportation des fichiers excel");
15     char fichier[500];
16     sprintf(fichier,"%s/.magic",getenv("HOME"));
17     param.lire(fichier);
18     param.enregistrer(fichier);
19     separateur=(param.get_nom("Separateur_decimale").c_str())[0];
20 francois 697 }
21    
22     MG_TABLE::~MG_TABLE()
23     {
24     }
25    
26    
27    
28     std::string MG_TABLE::info_noeud(FEM_MAILLAGE *fem, FEM_NOEUD* no)
29     {
30     LISTE_FEM_NOEUD::iterator it;
31     int numno=0;
32     for (FEM_NOEUD *notmp=fem->get_premier_noeud(it);notmp!=NULL;notmp=fem->get_suivant_noeud(it))
33     {
34     if (notmp==no) break;
35     numno++;
36     }
37     return info_noeud(fem,no,numno,true);
38    
39     }
40    
41 francois 698 void MG_TABLE::info_noeud(FEM_MAILLAGE *fem,char *nomfichier,MG_ELEMENT_TOPOLOGIQUE *topo)
42 francois 697 {
43     FILE* in=fopen(nomfichier,"wt");
44     LISTE_FEM_NOEUD::iterator it;
45     int numno=0;
46     std::string chaine;
47     for (FEM_NOEUD *notmp=fem->get_premier_noeud(it);notmp!=NULL;notmp=fem->get_suivant_noeud(it))
48     {
49 francois 698 static bool first=true;
50     if ((topo!=NULL) && (notmp->get_lien_topologie()!=topo)) {numno++;continue;}
51     if (first) chaine=info_noeud(fem,notmp,numno,true);
52 francois 697 else chaine=info_noeud(fem,notmp,numno,false);
53     fprintf(in,"%s\n",chaine.c_str());
54     numno++;
55 francois 698 first=false;
56 francois 697 }
57     fclose(in);
58    
59     }
60    
61     std::string MG_TABLE::info_noeud(FEM_MAILLAGE *fem, FEM_NOEUD* no,int numno,bool avectitre)
62     {
63     MG_GESTIONNAIRE *gest=fem->get_mg_maillage()->get_gestionnaire();
64 francois 808 std::string titre="Num;Id;Origine;x;y;z;";
65 francois 697 char chaine[255];
66 francois 808 sprintf(chaine,"%d;%lu;%d;%le;%le;%le;",numno+1,no->get_id(),no->get_mg_element_maillage()->get_origine(),no->get_x(),no->get_y(),no->get_z());
67 francois 697 std::string valeur=chaine;
68     LISTE_FEM_SOLUTION::iterator its;
69     for (FEM_SOLUTION* sol=gest->get_premier_fem_solution(its);sol!=NULL;sol=gest->get_suivant_fem_solution(its))
70     {
71     if (sol->get_entite_solution()!=MAGIC::ENTITE_SOLUTION::ENTITE_NOEUD) continue;
72     int dim=sol->get_dim_solution();
73     int nb_champs=sol->get_nb_champ();
74     for (int j=0;j<nb_champs;j++)
75     {
76     string nom=sol->get_nom()+ "_" + sol->get_legende(j);
77     int timestep=0;
78     bool avectimestep=false;
79     for (int k=0;k<nom.length();k++)
80     {
81     if (nom[k]==' ') nom[k]='_';
82     if (nom[k]=='%') {nom[k]=' ';avectimestep=true;}
83     }
84     if (avectimestep)
85     {
86     char message[500];
87     sscanf(nom.c_str(),"%s %d",message,&timestep);
88     nom=message;
89     nom=nom+ "_" + sol->get_legende(j);
90     sprintf(message,"%d",timestep);
91     nom=nom+"_"+"T"+message;
92     }
93     if (MAGIC::TYPE_SOLUTION::SCALAIRE==1)
94     {
95     if (avectitre) titre=titre+nom+";";
96     double val=sol->lire(numno,j);
97     sprintf(chaine,"%le;",val);
98     valeur=valeur+chaine;
99     }
100     if (dim==MAGIC::TYPE_SOLUTION::VECTEUR)
101     {
102     if (avectitre) titre=titre+nom+"_x;"+nom+"_y;"+nom+"_z;";
103     double val1=sol->lire(numno,j,0);
104     double val2=sol->lire(numno,j,1);
105     double val3=sol->lire(numno,j,2);
106     sprintf(chaine,"%le;%le;%le;",val1,val2,val3);
107     valeur=valeur+chaine;
108     }
109     }
110     }
111 francois 778 for (int i=0;i<valeur.length();i++)
112     if (valeur[i]=='.') valeur[i]=separateur;
113 francois 697 if (avectitre)
114     return titre+"\n"+valeur;
115     return valeur;
116    
117    
118     }
119    
120    
121    
122    
123     std::string MG_TABLE::info_element1(FEM_MAILLAGE *fem, FEM_ELEMENT1* ele)
124     {
125     LISTE_FEM_ELEMENT1::iterator it;
126     int num=0;
127     for (FEM_ELEMENT1 *eletmp=fem->get_premier_element1(it);eletmp!=NULL;eletmp=fem->get_suivant_element1(it))
128     {
129     if (eletmp==ele) break;
130     num++;
131     }
132 francois 853 return info_element1(fem,ele,num,true,false);
133 francois 697
134     }
135    
136 francois 698 void MG_TABLE::info_element1(FEM_MAILLAGE *fem,char *nomfichier,MG_ELEMENT_TOPOLOGIQUE *topo)
137 francois 697 {
138     FILE* in=fopen(nomfichier,"wt");
139     LISTE_FEM_ELEMENT1::iterator it;
140     int num=0;
141     std::string chaine;
142     for (FEM_ELEMENT1 *eletmp=fem->get_premier_element1(it);eletmp!=NULL;eletmp=fem->get_suivant_element1(it))
143     {
144 francois 698 static bool first=true;
145     if ((topo!=NULL) && (eletmp->get_lien_topologie()!=topo)) {num++;continue;}
146 francois 853 if (first) chaine=info_element1(fem,eletmp,num,true,false);
147     else chaine=info_element1(fem,eletmp,num,false,false);
148 francois 697 fprintf(in,"%s\n",chaine.c_str());
149     num++;
150 francois 698 first=false;
151 francois 697 }
152     fclose(in);
153    
154     }
155    
156 francois 853 std::string MG_TABLE::info_element1(FEM_MAILLAGE *fem, FEM_ELEMENT1* ele,int numno,bool avectitre,bool provnd)
157 francois 697 {
158     MG_GESTIONNAIRE *gest=fem->get_mg_maillage()->get_gestionnaire();
159 francois 808 std::string titre="Num;Id;Origine;";
160 francois 697 char chaine[255];
161 francois 808 sprintf(chaine,"%d;%lu;%d;",numno+1,ele->get_id(),ele->get_mg_element_maillage()->get_origine());
162 francois 697 std::string valeur=chaine;
163     LISTE_FEM_SOLUTION::iterator its;
164     for (FEM_SOLUTION* sol=gest->get_premier_fem_solution(its);sol!=NULL;sol=gest->get_suivant_fem_solution(its))
165     {
166 francois 853 if (!provnd)
167     if (sol->get_entite_solution()!=MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT1) continue;
168 francois 854 else if (sol->get_entite_solution()!=MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENTND) continue;
169     int dim=sol->get_dim_solution();
170 francois 697 int nb_champs=sol->get_nb_champ();
171     for (int j=0;j<nb_champs;j++)
172     {
173     string nom=sol->get_nom()+ "_" + sol->get_legende(j);
174     int timestep=0;
175     bool avectimestep=false;
176     for (int k=0;k<nom.length();k++)
177     {
178     if (nom[k]==' ') nom[k]='_';
179     if (nom[k]=='%') {nom[k]=' ';avectimestep=true;}
180     }
181     if (avectimestep)
182     {
183     char message[500];
184     sscanf(nom.c_str(),"%s %d",message,&timestep);
185     nom=message;
186     nom=nom+ "_" + sol->get_legende(j);
187     sprintf(message,"%d",timestep);
188     nom=nom+"_"+"T"+message;
189     }
190     if (dim==MAGIC::TYPE_SOLUTION::SCALAIRE)
191     {
192     if (avectitre) titre=titre+nom+";";
193     double val=sol->lire(numno,j);
194     sprintf(chaine,"%le;",val);
195     valeur=valeur+chaine;
196     }
197     if (dim==MAGIC::TYPE_SOLUTION::VECTEUR)
198     {
199     if (avectitre) titre=titre+nom+"_x;"+nom+"_y;"+nom+"_z;";
200     double val1=sol->lire(numno,j,0);
201     double val2=sol->lire(numno,j,1);
202     double val3=sol->lire(numno,j,2);
203     sprintf(chaine,"%le;%le;%le;",val1,val2,val3);
204     valeur=valeur+chaine;
205     }
206     }
207     }
208 francois 778 for (int i=0;i<valeur.length();i++)
209     if (valeur[i]=='.') valeur[i]=separateur;
210 francois 697 if (avectitre)
211     return titre+"\n"+valeur;
212     return valeur;
213    
214    
215     }
216    
217    
218    
219    
220    
221     std::string MG_TABLE::info_element2(FEM_MAILLAGE *fem, FEM_ELEMENT2* ele)
222     {
223     LISTE_FEM_ELEMENT2::iterator it;
224     int num=0;
225     for (FEM_ELEMENT2 *eletmp=fem->get_premier_element2(it);eletmp!=NULL;eletmp=fem->get_suivant_element2(it))
226     {
227     if (eletmp==ele) break;
228     num++;
229     }
230 francois 853 return info_element2(fem,ele,num,true,false);
231 francois 697
232     }
233    
234 francois 698 void MG_TABLE::info_element2(FEM_MAILLAGE *fem,char *nomfichier,MG_ELEMENT_TOPOLOGIQUE *topo)
235 francois 697 {
236     FILE* in=fopen(nomfichier,"wt");
237     LISTE_FEM_ELEMENT2::iterator it;
238     int num=0;
239     std::string chaine;
240     for (FEM_ELEMENT2 *eletmp=fem->get_premier_element2(it);eletmp!=NULL;eletmp=fem->get_suivant_element2(it))
241     {
242 francois 698 static bool first=true;
243     if ((topo!=NULL) && (eletmp->get_lien_topologie()!=topo)) {num++;continue;}
244 francois 853 if (first) chaine=info_element2(fem,eletmp,num,true,false);
245     else chaine=info_element2(fem,eletmp,num,false,false);
246 francois 697 fprintf(in,"%s\n",chaine.c_str());
247     num++;
248 francois 698 first=false;
249     }
250 francois 697 fclose(in);
251    
252     }
253    
254 francois 853 std::string MG_TABLE::info_element2(FEM_MAILLAGE *fem, FEM_ELEMENT2* ele,int numno,bool avectitre,bool provnd)
255 francois 697 {
256     MG_GESTIONNAIRE *gest=fem->get_mg_maillage()->get_gestionnaire();
257 francois 808 std::string titre="Num;Id;Origine;";
258 francois 697 char chaine[255];
259 francois 808 sprintf(chaine,"%d;%lu;%d;",numno+1,ele->get_id(),ele->get_mg_element_maillage()->get_origine());
260 francois 697 std::string valeur=chaine;
261     LISTE_FEM_SOLUTION::iterator its;
262     for (FEM_SOLUTION* sol=gest->get_premier_fem_solution(its);sol!=NULL;sol=gest->get_suivant_fem_solution(its))
263     {
264 francois 853 if (!provnd)
265     if (sol->get_entite_solution()!=MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2) continue;
266 francois 854 else if (sol->get_entite_solution()!=MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENTND) continue;
267 francois 697 int dim=sol->get_dim_solution();
268     int nb_champs=sol->get_nb_champ();
269     for (int j=0;j<nb_champs;j++)
270     {
271     string nom=sol->get_nom()+ "_" + sol->get_legende(j);
272     int timestep=0;
273     bool avectimestep=false;
274     for (int k=0;k<nom.length();k++)
275     {
276     if (nom[k]==' ') nom[k]='_';
277     if (nom[k]=='%') {nom[k]=' ';avectimestep=true;}
278     }
279     if (avectimestep)
280     {
281     char message[500];
282     sscanf(nom.c_str(),"%s %d",message,&timestep);
283     nom=message;
284     nom=nom+ "_" + sol->get_legende(j);
285     sprintf(message,"%d",timestep);
286     nom=nom+"_"+"T"+message;
287     }
288     if (dim==MAGIC::TYPE_SOLUTION::SCALAIRE)
289     {
290     if (avectitre) titre=titre+nom+";";
291     double val=sol->lire(numno,j);
292     sprintf(chaine,"%le;",val);
293     valeur=valeur+chaine;
294     }
295     if (dim==MAGIC::TYPE_SOLUTION::VECTEUR)
296     {
297     if (avectitre) titre=titre+nom+"_x;"+nom+"_y;"+nom+"_z;";
298     double val1=sol->lire(numno,j,0);
299     double val2=sol->lire(numno,j,1);
300     double val3=sol->lire(numno,j,2);
301     sprintf(chaine,"%le;%le;%le;",val1,val2,val3);
302     valeur=valeur+chaine;
303     }
304     }
305     }
306 francois 778 for (int i=0;i<valeur.length();i++)
307     if (valeur[i]=='.') valeur[i]=separateur;
308 francois 697 if (avectitre)
309     return titre+"\n"+valeur;
310     return valeur;
311    
312    
313     }
314    
315    
316    
317    
318     std::string MG_TABLE::info_element3(FEM_MAILLAGE *fem, FEM_ELEMENT3* ele)
319     {
320     LISTE_FEM_ELEMENT3::iterator it;
321     int num=0;
322     for (FEM_ELEMENT3 *eletmp=fem->get_premier_element3(it);eletmp!=NULL;eletmp=fem->get_suivant_element3(it))
323     {
324     if (eletmp==ele) break;
325     num++;
326     }
327 francois 853 return info_element3(fem,ele,num,true,false);
328 francois 697
329     }
330    
331 francois 698 void MG_TABLE::info_element3(FEM_MAILLAGE *fem,char *nomfichier,MG_ELEMENT_TOPOLOGIQUE *topo)
332 francois 697 {
333     FILE* in=fopen(nomfichier,"wt");
334     LISTE_FEM_ELEMENT3::iterator it;
335     int num=0;
336     std::string chaine;
337     for (FEM_ELEMENT3 *eletmp=fem->get_premier_element3(it);eletmp!=NULL;eletmp=fem->get_suivant_element3(it))
338     {
339 francois 698 static bool first=true;
340     if ((topo!=NULL) && (eletmp->get_lien_topologie()!=topo)) {num++;continue;}
341 francois 853 if (first) chaine=info_element3(fem,eletmp,num,true,false);
342     else chaine=info_element3(fem,eletmp,num,false,false);
343 francois 697 fprintf(in,"%s\n",chaine.c_str());
344     num++;
345 francois 698 first=false;
346     }
347 francois 697 fclose(in);
348    
349     }
350    
351 francois 853 std::string MG_TABLE::info_element3(FEM_MAILLAGE *fem, FEM_ELEMENT3* ele,int numno,bool avectitre,bool provnd)
352 francois 697 {
353     MG_GESTIONNAIRE *gest=fem->get_mg_maillage()->get_gestionnaire();
354 francois 808 std::string titre="Num;Id;Origine;";
355 francois 697 char chaine[255];
356 francois 808 sprintf(chaine,"%d;%lu;%d;",numno+1,ele->get_id(),ele->get_mg_element_maillage()->get_origine());
357 francois 697 std::string valeur=chaine;
358     LISTE_FEM_SOLUTION::iterator its;
359     for (FEM_SOLUTION* sol=gest->get_premier_fem_solution(its);sol!=NULL;sol=gest->get_suivant_fem_solution(its))
360     {
361 francois 853 if (!provnd)
362     if (sol->get_entite_solution()!=MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3) continue;
363 francois 854 else if (sol->get_entite_solution()!=MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENTND) continue;
364 francois 697 int dim=sol->get_dim_solution();
365     int nb_champs=sol->get_nb_champ();
366     for (int j=0;j<nb_champs;j++)
367     {
368     string nom=sol->get_nom()+ "_" + sol->get_legende(j);
369     int timestep=0;
370     bool avectimestep=false;
371     for (int k=0;k<nom.length();k++)
372     {
373     if (nom[k]==' ') nom[k]='_';
374     if (nom[k]=='%') {nom[k]=' ';avectimestep=true;}
375     }
376     if (avectimestep)
377     {
378     char message[500];
379     sscanf(nom.c_str(),"%s %d",message,&timestep);
380     nom=message;
381     nom=nom+ "_" + sol->get_legende(j);
382     sprintf(message,"%d",timestep);
383     nom=nom+"_"+"T"+message;
384     }
385     if (dim==MAGIC::TYPE_SOLUTION::SCALAIRE)
386     {
387     if (avectitre) titre=titre+nom+";";
388     double val=sol->lire(numno,j);
389     sprintf(chaine,"%le;",val);
390     valeur=valeur+chaine;
391     }
392     if (dim==MAGIC::TYPE_SOLUTION::VECTEUR)
393     {
394     if (avectitre) titre=titre+nom+"_x;"+nom+"_y;"+nom+"_z;";
395     double val1=sol->lire(numno,j,0);
396     double val2=sol->lire(numno,j,1);
397     double val3=sol->lire(numno,j,2);
398     sprintf(chaine,"%le;%le;%le;",val1,val2,val3);
399     valeur=valeur+chaine;
400     }
401     }
402     }
403 francois 778 for (int i=0;i<valeur.length();i++)
404     if (valeur[i]=='.') valeur[i]=separateur;
405 francois 697 if (avectitre)
406     return titre+"\n"+valeur;
407     return valeur;
408    
409    
410 francois 757 }
411    
412    
413 francois 789 void MG_TABLE::info_element_nd(FEM_MAILLAGE *fem,char *nomfichier,MG_ELEMENT_TOPOLOGIQUE *topo)
414     {
415     FILE* in=fopen(nomfichier,"wt");
416     LISTE_FEM_ELEMENT1::iterator it1;
417     LISTE_FEM_ELEMENT2::iterator it2;
418     LISTE_FEM_ELEMENT3::iterator it3;
419     int num=0;
420     std::string chaine;
421     bool first=true;
422     for (FEM_ELEMENT1 *eletmp=fem->get_premier_element1(it1);eletmp!=NULL;eletmp=fem->get_suivant_element1(it1))
423     {
424     if ((topo!=NULL) && (eletmp->get_lien_topologie()!=topo)) {num++;continue;}
425 francois 853 if (first) chaine=info_element1(fem,eletmp,num,true,true);
426     else chaine=info_element1(fem,eletmp,num,false,true);
427 francois 789 fprintf(in,"%s\n",chaine.c_str());
428     num++;
429     first=false;
430     }
431     for (FEM_ELEMENT2 *eletmp=fem->get_premier_element2(it2);eletmp!=NULL;eletmp=fem->get_suivant_element2(it2))
432     {
433     if ((topo!=NULL) && (eletmp->get_lien_topologie()!=topo)) {num++;continue;}
434 francois 853 if (first) chaine=info_element2(fem,eletmp,num,true,true);
435     else chaine=info_element2(fem,eletmp,num,false,true);
436 francois 789 fprintf(in,"%s\n",chaine.c_str());
437     num++;
438     first=false;
439     }
440     for (FEM_ELEMENT3 *eletmp=fem->get_premier_element3(it3);eletmp!=NULL;eletmp=fem->get_suivant_element3(it3))
441     {
442     if ((topo!=NULL) && (eletmp->get_lien_topologie()!=topo)) {num++;continue;}
443 francois 853 if (first) chaine=info_element3(fem,eletmp,num,true,true);
444     else chaine=info_element3(fem,eletmp,num,false,true);
445 francois 789 fprintf(in,"%s\n",chaine.c_str());
446     num++;
447     first=false;
448     }
449     fclose(in);
450    
451     }
452    
453 francois 757 void MG_TABLE::info_element_gauss3(FEM_MAILLAGE *fem,char *nomfichier,MG_ELEMENT_TOPOLOGIQUE *topo)
454     {
455     FILE* in=fopen(nomfichier,"wt");
456     LISTE_FEM_ELEMENT3::iterator it;
457     int num=0;
458     std::string chaine;
459     for (FEM_ELEMENT3 *eletmp=fem->get_premier_element3(it);eletmp!=NULL;eletmp=fem->get_suivant_element3(it))
460     {
461     static bool first=true;
462     if ((topo!=NULL) && (eletmp->get_lien_topologie()!=topo)) {num++;continue;}
463     if (first) chaine=info_element_gauss3(fem,eletmp,num,true);
464     else chaine=info_element_gauss3(fem,eletmp,num,false);
465     fprintf(in,"%s\n",chaine.c_str());
466     num++;
467     first=false;
468     }
469     fclose(in);
470    
471     }
472    
473     std::string MG_TABLE::info_element_gauss3(FEM_MAILLAGE *fem, FEM_ELEMENT3* ele,int numno,bool avectitre)
474     {
475     MG_GESTIONNAIRE *gest=fem->get_mg_maillage()->get_gestionnaire();
476     std::string titre="Num;Id;";
477     char chaine[255];
478     char chaine2[255];
479     sprintf(chaine,"%d;%lu;",numno+1,ele->get_id());
480     std::string valeur=chaine;
481     LISTE_FEM_SOLUTION::iterator its;
482     for (FEM_SOLUTION* sol=gest->get_premier_fem_solution(its);sol!=NULL;sol=gest->get_suivant_fem_solution(its))
483     {
484     if (sol->get_entite_solution()!=MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3_GAUSS) continue;
485     int dim=sol->get_dim_solution();
486     int nb_champs=sol->get_nb_champ();
487     for (int j=0;j<nb_champs;j++)
488     {
489     string nom=sol->get_nom()+ "_" + sol->get_legende(j);
490     int timestep=0;
491     bool avectimestep=false;
492     for (int k=0;k<nom.length();k++)
493     {
494     if (nom[k]==' ') nom[k]='_';
495     if (nom[k]=='%') {nom[k]=' ';avectimestep=true;}
496     }
497     if (avectimestep)
498     {
499     char message[500];
500     sscanf(nom.c_str(),"%s %d",message,&timestep);
501     nom=message;
502     nom=nom+ "_" + sol->get_legende(j);
503     sprintf(message,"%d",timestep);
504     nom=nom+"_"+"T"+message;
505     }
506     if (dim==MAGIC::TYPE_SOLUTION::SCALAIRE)
507     {
508     int nbgauss=sol->get_nb_gauss(numno);
509     for (int i=0;i<nbgauss;i++)
510     {
511     string numgauss=to_string(i+1);
512     if (avectitre) titre=titre+nom+"_G"+numgauss+";";
513     double val=sol->lire(numno,j,0,i);
514     sprintf(chaine,"%le;",val);
515     valeur=valeur+chaine;
516     }
517     }
518     if (dim==MAGIC::TYPE_SOLUTION::VECTEUR)
519     {
520     int nbgauss=sol->get_nb_gauss(numno);
521     for (int i=0;i<nbgauss;i++)
522     {
523     std::string numgauss=to_string(i+1);
524     std:string nom2;
525     if (avectitre) nom2=nom+"_G"+numgauss;
526     if (avectitre) titre=titre+nom2+"_x;"+nom2+"_y;"+nom2+"_z;";
527     double val1=sol->lire(numno,j,0,i);
528     double val2=sol->lire(numno,j,1,i);
529     double val3=sol->lire(numno,j,2,i);
530     sprintf(chaine,"%le;%le;%le;",val1,val2,val3);
531     valeur=valeur+chaine;
532     }
533    
534     }
535     }
536     }
537 francois 778 for (int i=0;i<valeur.length();i++)
538     if (valeur[i]=='.') valeur[i]=separateur;
539 francois 757 if (avectitre)
540     return titre+"\n"+valeur;
541     return valeur;
542    
543    
544     }
545    
546    
547     void MG_TABLE::info_element_gauss1(FEM_MAILLAGE *fem,char *nomfichier,MG_ELEMENT_TOPOLOGIQUE *topo)
548     {
549     FILE* in=fopen(nomfichier,"wt");
550     LISTE_FEM_ELEMENT1::iterator it;
551     int num=0;
552     std::string chaine;
553     for (FEM_ELEMENT1 *eletmp=fem->get_premier_element1(it);eletmp!=NULL;eletmp=fem->get_suivant_element1(it))
554     {
555     static bool first=true;
556     if ((topo!=NULL) && (eletmp->get_lien_topologie()!=topo)) {num++;continue;}
557     if (first) chaine=info_element_gauss1(fem,eletmp,num,true);
558     else chaine=info_element_gauss1(fem,eletmp,num,false);
559     fprintf(in,"%s\n",chaine.c_str());
560     num++;
561     first=false;
562     }
563     fclose(in);
564    
565     }
566    
567     std::string MG_TABLE::info_element_gauss1(FEM_MAILLAGE *fem, FEM_ELEMENT1* ele,int numno,bool avectitre)
568     {
569     MG_GESTIONNAIRE *gest=fem->get_mg_maillage()->get_gestionnaire();
570     std::string titre="Num;Id;";
571     char chaine[255];
572     char chaine2[255];
573     sprintf(chaine,"%d;%lu;",numno+1,ele->get_id());
574     std::string valeur=chaine;
575     LISTE_FEM_SOLUTION::iterator its;
576     for (FEM_SOLUTION* sol=gest->get_premier_fem_solution(its);sol!=NULL;sol=gest->get_suivant_fem_solution(its))
577     {
578     if (sol->get_entite_solution()!=MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT1_GAUSS) continue;
579     int dim=sol->get_dim_solution();
580     int nb_champs=sol->get_nb_champ();
581     for (int j=0;j<nb_champs;j++)
582     {
583     string nom=sol->get_nom()+ "_" + sol->get_legende(j);
584     int timestep=0;
585     bool avectimestep=false;
586     for (int k=0;k<nom.length();k++)
587     {
588     if (nom[k]==' ') nom[k]='_';
589     if (nom[k]=='%') {nom[k]=' ';avectimestep=true;}
590     }
591     if (avectimestep)
592     {
593     char message[500];
594     sscanf(nom.c_str(),"%s %d",message,&timestep);
595     nom=message;
596     nom=nom+ "_" + sol->get_legende(j);
597     sprintf(message,"%d",timestep);
598     nom=nom+"_"+"T"+message;
599     }
600     if (dim==MAGIC::TYPE_SOLUTION::SCALAIRE)
601     {
602     int nbgauss=sol->get_nb_gauss(numno);
603     for (int i=0;i<nbgauss;i++)
604     {
605     string numgauss=to_string(i+1);
606     if (avectitre) titre=titre+nom+"_G"+numgauss+";";
607     double val=sol->lire(numno,j,0,i);
608     sprintf(chaine,"%le;",val);
609     valeur=valeur+chaine;
610     }
611     }
612     if (dim==MAGIC::TYPE_SOLUTION::VECTEUR)
613     {
614     int nbgauss=sol->get_nb_gauss(numno);
615     for (int i=0;i<nbgauss;i++)
616     {
617     std::string numgauss=to_string(i+1);
618     std:string nom2;
619     if (avectitre) nom2=nom+"_G"+numgauss;
620     if (avectitre) titre=titre+nom2+"_x;"+nom2+"_y;"+nom2+"_z;";
621     double val1=sol->lire(numno,j,0,i);
622     double val2=sol->lire(numno,j,1,i);
623     double val3=sol->lire(numno,j,2,i);
624     sprintf(chaine,"%le;%le;%le;",val1,val2,val3);
625     valeur=valeur+chaine;
626     }
627    
628     }
629     }
630     }
631 francois 778 for (int i=0;i<valeur.length();i++)
632     if (valeur[i]=='.') valeur[i]=separateur;
633 francois 757 if (avectitre)
634     return titre+"\n"+valeur;
635     return valeur;
636     }
637    
638    
639     void MG_TABLE::info_element_gauss2(FEM_MAILLAGE *fem,char *nomfichier,MG_ELEMENT_TOPOLOGIQUE *topo)
640     {
641     FILE* in=fopen(nomfichier,"wt");
642     LISTE_FEM_ELEMENT2::iterator it;
643     int num=0;
644     std::string chaine;
645     for (FEM_ELEMENT2 *eletmp=fem->get_premier_element2(it);eletmp!=NULL;eletmp=fem->get_suivant_element2(it))
646     {
647     static bool first=true;
648     if ((topo!=NULL) && (eletmp->get_lien_topologie()!=topo)) {num++;continue;}
649     if (first) chaine=info_element_gauss2(fem,eletmp,num,true);
650     else chaine=info_element_gauss2(fem,eletmp,num,false);
651     fprintf(in,"%s\n",chaine.c_str());
652     num++;
653     first=false;
654     }
655     fclose(in);
656    
657     }
658    
659     std::string MG_TABLE::info_element_gauss2(FEM_MAILLAGE *fem, FEM_ELEMENT2* ele,int numno,bool avectitre)
660     {
661     MG_GESTIONNAIRE *gest=fem->get_mg_maillage()->get_gestionnaire();
662     std::string titre="Num;Id;";
663     char chaine[255];
664     char chaine2[255];
665     sprintf(chaine,"%d;%lu;",numno+1,ele->get_id());
666     std::string valeur=chaine;
667     LISTE_FEM_SOLUTION::iterator its;
668     for (FEM_SOLUTION* sol=gest->get_premier_fem_solution(its);sol!=NULL;sol=gest->get_suivant_fem_solution(its))
669     {
670     if (sol->get_entite_solution()!=MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2_GAUSS) continue;
671     int dim=sol->get_dim_solution();
672     int nb_champs=sol->get_nb_champ();
673     for (int j=0;j<nb_champs;j++)
674     {
675     string nom=sol->get_nom()+ "_" + sol->get_legende(j);
676     int timestep=0;
677     bool avectimestep=false;
678     for (int k=0;k<nom.length();k++)
679     {
680     if (nom[k]==' ') nom[k]='_';
681     if (nom[k]=='%') {nom[k]=' ';avectimestep=true;}
682     }
683     if (avectimestep)
684     {
685     char message[500];
686     sscanf(nom.c_str(),"%s %d",message,&timestep);
687     nom=message;
688     nom=nom+ "_" + sol->get_legende(j);
689     sprintf(message,"%d",timestep);
690     nom=nom+"_"+"T"+message;
691     }
692     if (dim==MAGIC::TYPE_SOLUTION::SCALAIRE)
693     {
694     int nbgauss=sol->get_nb_gauss(numno);
695     for (int i=0;i<nbgauss;i++)
696     {
697     string numgauss=to_string(i+1);
698     if (avectitre) titre=titre+nom+"_G"+numgauss+";";
699     double val=sol->lire(numno,j,0,i);
700     sprintf(chaine,"%le;",val);
701     valeur=valeur+chaine;
702     }
703     }
704     if (dim==MAGIC::TYPE_SOLUTION::VECTEUR)
705     {
706     int nbgauss=sol->get_nb_gauss(numno);
707     for (int i=0;i<nbgauss;i++)
708     {
709     std::string numgauss=to_string(i+1);
710     std:string nom2;
711     if (avectitre) nom2=nom+"_G"+numgauss;
712     if (avectitre) titre=titre+nom2+"_x;"+nom2+"_y;"+nom2+"_z;";
713     double val1=sol->lire(numno,j,0,i);
714     double val2=sol->lire(numno,j,1,i);
715     double val3=sol->lire(numno,j,2,i);
716     sprintf(chaine,"%le;%le;%le;",val1,val2,val3);
717     valeur=valeur+chaine;
718     }
719    
720     }
721     }
722     }
723 francois 778 for (int i=0;i<valeur.length();i++)
724     if (valeur[i]=='.') valeur[i]=separateur;
725 francois 757 if (avectitre)
726     return titre+"\n"+valeur;
727     return valeur;
728    
729    
730 francois 697 }