ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/fichier/src/mg_table.cpp
Revision: 853
Committed: Fri Nov 4 19:51:18 2016 UTC (8 years, 6 months ago) by francois
File size: 21422 byte(s)
Log Message:
plasticite avec decharge des efforts (param supplementaire dans le fichier param)

bug dans les table pour les solutions mixtes

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 789 int dim=sol->get_dim_solution();
169 francois 697 int nb_champs=sol->get_nb_champ();
170     for (int j=0;j<nb_champs;j++)
171     {
172     string nom=sol->get_nom()+ "_" + sol->get_legende(j);
173     int timestep=0;
174     bool avectimestep=false;
175     for (int k=0;k<nom.length();k++)
176     {
177     if (nom[k]==' ') nom[k]='_';
178     if (nom[k]=='%') {nom[k]=' ';avectimestep=true;}
179     }
180     if (avectimestep)
181     {
182     char message[500];
183     sscanf(nom.c_str(),"%s %d",message,&timestep);
184     nom=message;
185     nom=nom+ "_" + sol->get_legende(j);
186     sprintf(message,"%d",timestep);
187     nom=nom+"_"+"T"+message;
188     }
189     if (dim==MAGIC::TYPE_SOLUTION::SCALAIRE)
190     {
191     if (avectitre) titre=titre+nom+";";
192     double val=sol->lire(numno,j);
193     sprintf(chaine,"%le;",val);
194     valeur=valeur+chaine;
195     }
196     if (dim==MAGIC::TYPE_SOLUTION::VECTEUR)
197     {
198     if (avectitre) titre=titre+nom+"_x;"+nom+"_y;"+nom+"_z;";
199     double val1=sol->lire(numno,j,0);
200     double val2=sol->lire(numno,j,1);
201     double val3=sol->lire(numno,j,2);
202     sprintf(chaine,"%le;%le;%le;",val1,val2,val3);
203     valeur=valeur+chaine;
204     }
205     }
206     }
207 francois 778 for (int i=0;i<valeur.length();i++)
208     if (valeur[i]=='.') valeur[i]=separateur;
209 francois 697 if (avectitre)
210     return titre+"\n"+valeur;
211     return valeur;
212    
213    
214     }
215    
216    
217    
218    
219    
220     std::string MG_TABLE::info_element2(FEM_MAILLAGE *fem, FEM_ELEMENT2* ele)
221     {
222     LISTE_FEM_ELEMENT2::iterator it;
223     int num=0;
224     for (FEM_ELEMENT2 *eletmp=fem->get_premier_element2(it);eletmp!=NULL;eletmp=fem->get_suivant_element2(it))
225     {
226     if (eletmp==ele) break;
227     num++;
228     }
229 francois 853 return info_element2(fem,ele,num,true,false);
230 francois 697
231     }
232    
233 francois 698 void MG_TABLE::info_element2(FEM_MAILLAGE *fem,char *nomfichier,MG_ELEMENT_TOPOLOGIQUE *topo)
234 francois 697 {
235     FILE* in=fopen(nomfichier,"wt");
236     LISTE_FEM_ELEMENT2::iterator it;
237     int num=0;
238     std::string chaine;
239     for (FEM_ELEMENT2 *eletmp=fem->get_premier_element2(it);eletmp!=NULL;eletmp=fem->get_suivant_element2(it))
240     {
241 francois 698 static bool first=true;
242     if ((topo!=NULL) && (eletmp->get_lien_topologie()!=topo)) {num++;continue;}
243 francois 853 if (first) chaine=info_element2(fem,eletmp,num,true,false);
244     else chaine=info_element2(fem,eletmp,num,false,false);
245 francois 697 fprintf(in,"%s\n",chaine.c_str());
246     num++;
247 francois 698 first=false;
248     }
249 francois 697 fclose(in);
250    
251     }
252    
253 francois 853 std::string MG_TABLE::info_element2(FEM_MAILLAGE *fem, FEM_ELEMENT2* ele,int numno,bool avectitre,bool provnd)
254 francois 697 {
255     MG_GESTIONNAIRE *gest=fem->get_mg_maillage()->get_gestionnaire();
256 francois 808 std::string titre="Num;Id;Origine;";
257 francois 697 char chaine[255];
258 francois 808 sprintf(chaine,"%d;%lu;%d;",numno+1,ele->get_id(),ele->get_mg_element_maillage()->get_origine());
259 francois 697 std::string valeur=chaine;
260     LISTE_FEM_SOLUTION::iterator its;
261     for (FEM_SOLUTION* sol=gest->get_premier_fem_solution(its);sol!=NULL;sol=gest->get_suivant_fem_solution(its))
262     {
263 francois 853 if (!provnd)
264     if (sol->get_entite_solution()!=MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2) continue;
265 francois 697 int dim=sol->get_dim_solution();
266     int nb_champs=sol->get_nb_champ();
267     for (int j=0;j<nb_champs;j++)
268     {
269     string nom=sol->get_nom()+ "_" + sol->get_legende(j);
270     int timestep=0;
271     bool avectimestep=false;
272     for (int k=0;k<nom.length();k++)
273     {
274     if (nom[k]==' ') nom[k]='_';
275     if (nom[k]=='%') {nom[k]=' ';avectimestep=true;}
276     }
277     if (avectimestep)
278     {
279     char message[500];
280     sscanf(nom.c_str(),"%s %d",message,&timestep);
281     nom=message;
282     nom=nom+ "_" + sol->get_legende(j);
283     sprintf(message,"%d",timestep);
284     nom=nom+"_"+"T"+message;
285     }
286     if (dim==MAGIC::TYPE_SOLUTION::SCALAIRE)
287     {
288     if (avectitre) titre=titre+nom+";";
289     double val=sol->lire(numno,j);
290     sprintf(chaine,"%le;",val);
291     valeur=valeur+chaine;
292     }
293     if (dim==MAGIC::TYPE_SOLUTION::VECTEUR)
294     {
295     if (avectitre) titre=titre+nom+"_x;"+nom+"_y;"+nom+"_z;";
296     double val1=sol->lire(numno,j,0);
297     double val2=sol->lire(numno,j,1);
298     double val3=sol->lire(numno,j,2);
299     sprintf(chaine,"%le;%le;%le;",val1,val2,val3);
300     valeur=valeur+chaine;
301     }
302     }
303     }
304 francois 778 for (int i=0;i<valeur.length();i++)
305     if (valeur[i]=='.') valeur[i]=separateur;
306 francois 697 if (avectitre)
307     return titre+"\n"+valeur;
308     return valeur;
309    
310    
311     }
312    
313    
314    
315    
316     std::string MG_TABLE::info_element3(FEM_MAILLAGE *fem, FEM_ELEMENT3* ele)
317     {
318     LISTE_FEM_ELEMENT3::iterator it;
319     int num=0;
320     for (FEM_ELEMENT3 *eletmp=fem->get_premier_element3(it);eletmp!=NULL;eletmp=fem->get_suivant_element3(it))
321     {
322     if (eletmp==ele) break;
323     num++;
324     }
325 francois 853 return info_element3(fem,ele,num,true,false);
326 francois 697
327     }
328    
329 francois 698 void MG_TABLE::info_element3(FEM_MAILLAGE *fem,char *nomfichier,MG_ELEMENT_TOPOLOGIQUE *topo)
330 francois 697 {
331     FILE* in=fopen(nomfichier,"wt");
332     LISTE_FEM_ELEMENT3::iterator it;
333     int num=0;
334     std::string chaine;
335     for (FEM_ELEMENT3 *eletmp=fem->get_premier_element3(it);eletmp!=NULL;eletmp=fem->get_suivant_element3(it))
336     {
337 francois 698 static bool first=true;
338     if ((topo!=NULL) && (eletmp->get_lien_topologie()!=topo)) {num++;continue;}
339 francois 853 if (first) chaine=info_element3(fem,eletmp,num,true,false);
340     else chaine=info_element3(fem,eletmp,num,false,false);
341 francois 697 fprintf(in,"%s\n",chaine.c_str());
342     num++;
343 francois 698 first=false;
344     }
345 francois 697 fclose(in);
346    
347     }
348    
349 francois 853 std::string MG_TABLE::info_element3(FEM_MAILLAGE *fem, FEM_ELEMENT3* ele,int numno,bool avectitre,bool provnd)
350 francois 697 {
351     MG_GESTIONNAIRE *gest=fem->get_mg_maillage()->get_gestionnaire();
352 francois 808 std::string titre="Num;Id;Origine;";
353 francois 697 char chaine[255];
354 francois 808 sprintf(chaine,"%d;%lu;%d;",numno+1,ele->get_id(),ele->get_mg_element_maillage()->get_origine());
355 francois 697 std::string valeur=chaine;
356     LISTE_FEM_SOLUTION::iterator its;
357     for (FEM_SOLUTION* sol=gest->get_premier_fem_solution(its);sol!=NULL;sol=gest->get_suivant_fem_solution(its))
358     {
359 francois 853 if (!provnd)
360     if (sol->get_entite_solution()!=MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3) continue;
361 francois 697 int dim=sol->get_dim_solution();
362     int nb_champs=sol->get_nb_champ();
363     for (int j=0;j<nb_champs;j++)
364     {
365     string nom=sol->get_nom()+ "_" + sol->get_legende(j);
366     int timestep=0;
367     bool avectimestep=false;
368     for (int k=0;k<nom.length();k++)
369     {
370     if (nom[k]==' ') nom[k]='_';
371     if (nom[k]=='%') {nom[k]=' ';avectimestep=true;}
372     }
373     if (avectimestep)
374     {
375     char message[500];
376     sscanf(nom.c_str(),"%s %d",message,&timestep);
377     nom=message;
378     nom=nom+ "_" + sol->get_legende(j);
379     sprintf(message,"%d",timestep);
380     nom=nom+"_"+"T"+message;
381     }
382     if (dim==MAGIC::TYPE_SOLUTION::SCALAIRE)
383     {
384     if (avectitre) titre=titre+nom+";";
385     double val=sol->lire(numno,j);
386     sprintf(chaine,"%le;",val);
387     valeur=valeur+chaine;
388     }
389     if (dim==MAGIC::TYPE_SOLUTION::VECTEUR)
390     {
391     if (avectitre) titre=titre+nom+"_x;"+nom+"_y;"+nom+"_z;";
392     double val1=sol->lire(numno,j,0);
393     double val2=sol->lire(numno,j,1);
394     double val3=sol->lire(numno,j,2);
395     sprintf(chaine,"%le;%le;%le;",val1,val2,val3);
396     valeur=valeur+chaine;
397     }
398     }
399     }
400 francois 778 for (int i=0;i<valeur.length();i++)
401     if (valeur[i]=='.') valeur[i]=separateur;
402 francois 697 if (avectitre)
403     return titre+"\n"+valeur;
404     return valeur;
405    
406    
407 francois 757 }
408    
409    
410 francois 789 void MG_TABLE::info_element_nd(FEM_MAILLAGE *fem,char *nomfichier,MG_ELEMENT_TOPOLOGIQUE *topo)
411     {
412     FILE* in=fopen(nomfichier,"wt");
413     LISTE_FEM_ELEMENT1::iterator it1;
414     LISTE_FEM_ELEMENT2::iterator it2;
415     LISTE_FEM_ELEMENT3::iterator it3;
416     int num=0;
417     std::string chaine;
418     bool first=true;
419     for (FEM_ELEMENT1 *eletmp=fem->get_premier_element1(it1);eletmp!=NULL;eletmp=fem->get_suivant_element1(it1))
420     {
421     if ((topo!=NULL) && (eletmp->get_lien_topologie()!=topo)) {num++;continue;}
422 francois 853 if (first) chaine=info_element1(fem,eletmp,num,true,true);
423     else chaine=info_element1(fem,eletmp,num,false,true);
424 francois 789 fprintf(in,"%s\n",chaine.c_str());
425     num++;
426     first=false;
427     }
428     for (FEM_ELEMENT2 *eletmp=fem->get_premier_element2(it2);eletmp!=NULL;eletmp=fem->get_suivant_element2(it2))
429     {
430     if ((topo!=NULL) && (eletmp->get_lien_topologie()!=topo)) {num++;continue;}
431 francois 853 if (first) chaine=info_element2(fem,eletmp,num,true,true);
432     else chaine=info_element2(fem,eletmp,num,false,true);
433 francois 789 fprintf(in,"%s\n",chaine.c_str());
434     num++;
435     first=false;
436     }
437     for (FEM_ELEMENT3 *eletmp=fem->get_premier_element3(it3);eletmp!=NULL;eletmp=fem->get_suivant_element3(it3))
438     {
439     if ((topo!=NULL) && (eletmp->get_lien_topologie()!=topo)) {num++;continue;}
440 francois 853 if (first) chaine=info_element3(fem,eletmp,num,true,true);
441     else chaine=info_element3(fem,eletmp,num,false,true);
442 francois 789 fprintf(in,"%s\n",chaine.c_str());
443     num++;
444     first=false;
445     }
446     fclose(in);
447    
448     }
449    
450 francois 757 void MG_TABLE::info_element_gauss3(FEM_MAILLAGE *fem,char *nomfichier,MG_ELEMENT_TOPOLOGIQUE *topo)
451     {
452     FILE* in=fopen(nomfichier,"wt");
453     LISTE_FEM_ELEMENT3::iterator it;
454     int num=0;
455     std::string chaine;
456     for (FEM_ELEMENT3 *eletmp=fem->get_premier_element3(it);eletmp!=NULL;eletmp=fem->get_suivant_element3(it))
457     {
458     static bool first=true;
459     if ((topo!=NULL) && (eletmp->get_lien_topologie()!=topo)) {num++;continue;}
460     if (first) chaine=info_element_gauss3(fem,eletmp,num,true);
461     else chaine=info_element_gauss3(fem,eletmp,num,false);
462     fprintf(in,"%s\n",chaine.c_str());
463     num++;
464     first=false;
465     }
466     fclose(in);
467    
468     }
469    
470     std::string MG_TABLE::info_element_gauss3(FEM_MAILLAGE *fem, FEM_ELEMENT3* ele,int numno,bool avectitre)
471     {
472     MG_GESTIONNAIRE *gest=fem->get_mg_maillage()->get_gestionnaire();
473     std::string titre="Num;Id;";
474     char chaine[255];
475     char chaine2[255];
476     sprintf(chaine,"%d;%lu;",numno+1,ele->get_id());
477     std::string valeur=chaine;
478     LISTE_FEM_SOLUTION::iterator its;
479     for (FEM_SOLUTION* sol=gest->get_premier_fem_solution(its);sol!=NULL;sol=gest->get_suivant_fem_solution(its))
480     {
481     if (sol->get_entite_solution()!=MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3_GAUSS) continue;
482     int dim=sol->get_dim_solution();
483     int nb_champs=sol->get_nb_champ();
484     for (int j=0;j<nb_champs;j++)
485     {
486     string nom=sol->get_nom()+ "_" + sol->get_legende(j);
487     int timestep=0;
488     bool avectimestep=false;
489     for (int k=0;k<nom.length();k++)
490     {
491     if (nom[k]==' ') nom[k]='_';
492     if (nom[k]=='%') {nom[k]=' ';avectimestep=true;}
493     }
494     if (avectimestep)
495     {
496     char message[500];
497     sscanf(nom.c_str(),"%s %d",message,&timestep);
498     nom=message;
499     nom=nom+ "_" + sol->get_legende(j);
500     sprintf(message,"%d",timestep);
501     nom=nom+"_"+"T"+message;
502     }
503     if (dim==MAGIC::TYPE_SOLUTION::SCALAIRE)
504     {
505     int nbgauss=sol->get_nb_gauss(numno);
506     for (int i=0;i<nbgauss;i++)
507     {
508     string numgauss=to_string(i+1);
509     if (avectitre) titre=titre+nom+"_G"+numgauss+";";
510     double val=sol->lire(numno,j,0,i);
511     sprintf(chaine,"%le;",val);
512     valeur=valeur+chaine;
513     }
514     }
515     if (dim==MAGIC::TYPE_SOLUTION::VECTEUR)
516     {
517     int nbgauss=sol->get_nb_gauss(numno);
518     for (int i=0;i<nbgauss;i++)
519     {
520     std::string numgauss=to_string(i+1);
521     std:string nom2;
522     if (avectitre) nom2=nom+"_G"+numgauss;
523     if (avectitre) titre=titre+nom2+"_x;"+nom2+"_y;"+nom2+"_z;";
524     double val1=sol->lire(numno,j,0,i);
525     double val2=sol->lire(numno,j,1,i);
526     double val3=sol->lire(numno,j,2,i);
527     sprintf(chaine,"%le;%le;%le;",val1,val2,val3);
528     valeur=valeur+chaine;
529     }
530    
531     }
532     }
533     }
534 francois 778 for (int i=0;i<valeur.length();i++)
535     if (valeur[i]=='.') valeur[i]=separateur;
536 francois 757 if (avectitre)
537     return titre+"\n"+valeur;
538     return valeur;
539    
540    
541     }
542    
543    
544     void MG_TABLE::info_element_gauss1(FEM_MAILLAGE *fem,char *nomfichier,MG_ELEMENT_TOPOLOGIQUE *topo)
545     {
546     FILE* in=fopen(nomfichier,"wt");
547     LISTE_FEM_ELEMENT1::iterator it;
548     int num=0;
549     std::string chaine;
550     for (FEM_ELEMENT1 *eletmp=fem->get_premier_element1(it);eletmp!=NULL;eletmp=fem->get_suivant_element1(it))
551     {
552     static bool first=true;
553     if ((topo!=NULL) && (eletmp->get_lien_topologie()!=topo)) {num++;continue;}
554     if (first) chaine=info_element_gauss1(fem,eletmp,num,true);
555     else chaine=info_element_gauss1(fem,eletmp,num,false);
556     fprintf(in,"%s\n",chaine.c_str());
557     num++;
558     first=false;
559     }
560     fclose(in);
561    
562     }
563    
564     std::string MG_TABLE::info_element_gauss1(FEM_MAILLAGE *fem, FEM_ELEMENT1* ele,int numno,bool avectitre)
565     {
566     MG_GESTIONNAIRE *gest=fem->get_mg_maillage()->get_gestionnaire();
567     std::string titre="Num;Id;";
568     char chaine[255];
569     char chaine2[255];
570     sprintf(chaine,"%d;%lu;",numno+1,ele->get_id());
571     std::string valeur=chaine;
572     LISTE_FEM_SOLUTION::iterator its;
573     for (FEM_SOLUTION* sol=gest->get_premier_fem_solution(its);sol!=NULL;sol=gest->get_suivant_fem_solution(its))
574     {
575     if (sol->get_entite_solution()!=MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT1_GAUSS) continue;
576     int dim=sol->get_dim_solution();
577     int nb_champs=sol->get_nb_champ();
578     for (int j=0;j<nb_champs;j++)
579     {
580     string nom=sol->get_nom()+ "_" + sol->get_legende(j);
581     int timestep=0;
582     bool avectimestep=false;
583     for (int k=0;k<nom.length();k++)
584     {
585     if (nom[k]==' ') nom[k]='_';
586     if (nom[k]=='%') {nom[k]=' ';avectimestep=true;}
587     }
588     if (avectimestep)
589     {
590     char message[500];
591     sscanf(nom.c_str(),"%s %d",message,&timestep);
592     nom=message;
593     nom=nom+ "_" + sol->get_legende(j);
594     sprintf(message,"%d",timestep);
595     nom=nom+"_"+"T"+message;
596     }
597     if (dim==MAGIC::TYPE_SOLUTION::SCALAIRE)
598     {
599     int nbgauss=sol->get_nb_gauss(numno);
600     for (int i=0;i<nbgauss;i++)
601     {
602     string numgauss=to_string(i+1);
603     if (avectitre) titre=titre+nom+"_G"+numgauss+";";
604     double val=sol->lire(numno,j,0,i);
605     sprintf(chaine,"%le;",val);
606     valeur=valeur+chaine;
607     }
608     }
609     if (dim==MAGIC::TYPE_SOLUTION::VECTEUR)
610     {
611     int nbgauss=sol->get_nb_gauss(numno);
612     for (int i=0;i<nbgauss;i++)
613     {
614     std::string numgauss=to_string(i+1);
615     std:string nom2;
616     if (avectitre) nom2=nom+"_G"+numgauss;
617     if (avectitre) titre=titre+nom2+"_x;"+nom2+"_y;"+nom2+"_z;";
618     double val1=sol->lire(numno,j,0,i);
619     double val2=sol->lire(numno,j,1,i);
620     double val3=sol->lire(numno,j,2,i);
621     sprintf(chaine,"%le;%le;%le;",val1,val2,val3);
622     valeur=valeur+chaine;
623     }
624    
625     }
626     }
627     }
628 francois 778 for (int i=0;i<valeur.length();i++)
629     if (valeur[i]=='.') valeur[i]=separateur;
630 francois 757 if (avectitre)
631     return titre+"\n"+valeur;
632     return valeur;
633     }
634    
635    
636     void MG_TABLE::info_element_gauss2(FEM_MAILLAGE *fem,char *nomfichier,MG_ELEMENT_TOPOLOGIQUE *topo)
637     {
638     FILE* in=fopen(nomfichier,"wt");
639     LISTE_FEM_ELEMENT2::iterator it;
640     int num=0;
641     std::string chaine;
642     for (FEM_ELEMENT2 *eletmp=fem->get_premier_element2(it);eletmp!=NULL;eletmp=fem->get_suivant_element2(it))
643     {
644     static bool first=true;
645     if ((topo!=NULL) && (eletmp->get_lien_topologie()!=topo)) {num++;continue;}
646     if (first) chaine=info_element_gauss2(fem,eletmp,num,true);
647     else chaine=info_element_gauss2(fem,eletmp,num,false);
648     fprintf(in,"%s\n",chaine.c_str());
649     num++;
650     first=false;
651     }
652     fclose(in);
653    
654     }
655    
656     std::string MG_TABLE::info_element_gauss2(FEM_MAILLAGE *fem, FEM_ELEMENT2* ele,int numno,bool avectitre)
657     {
658     MG_GESTIONNAIRE *gest=fem->get_mg_maillage()->get_gestionnaire();
659     std::string titre="Num;Id;";
660     char chaine[255];
661     char chaine2[255];
662     sprintf(chaine,"%d;%lu;",numno+1,ele->get_id());
663     std::string valeur=chaine;
664     LISTE_FEM_SOLUTION::iterator its;
665     for (FEM_SOLUTION* sol=gest->get_premier_fem_solution(its);sol!=NULL;sol=gest->get_suivant_fem_solution(its))
666     {
667     if (sol->get_entite_solution()!=MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2_GAUSS) continue;
668     int dim=sol->get_dim_solution();
669     int nb_champs=sol->get_nb_champ();
670     for (int j=0;j<nb_champs;j++)
671     {
672     string nom=sol->get_nom()+ "_" + sol->get_legende(j);
673     int timestep=0;
674     bool avectimestep=false;
675     for (int k=0;k<nom.length();k++)
676     {
677     if (nom[k]==' ') nom[k]='_';
678     if (nom[k]=='%') {nom[k]=' ';avectimestep=true;}
679     }
680     if (avectimestep)
681     {
682     char message[500];
683     sscanf(nom.c_str(),"%s %d",message,&timestep);
684     nom=message;
685     nom=nom+ "_" + sol->get_legende(j);
686     sprintf(message,"%d",timestep);
687     nom=nom+"_"+"T"+message;
688     }
689     if (dim==MAGIC::TYPE_SOLUTION::SCALAIRE)
690     {
691     int nbgauss=sol->get_nb_gauss(numno);
692     for (int i=0;i<nbgauss;i++)
693     {
694     string numgauss=to_string(i+1);
695     if (avectitre) titre=titre+nom+"_G"+numgauss+";";
696     double val=sol->lire(numno,j,0,i);
697     sprintf(chaine,"%le;",val);
698     valeur=valeur+chaine;
699     }
700     }
701     if (dim==MAGIC::TYPE_SOLUTION::VECTEUR)
702     {
703     int nbgauss=sol->get_nb_gauss(numno);
704     for (int i=0;i<nbgauss;i++)
705     {
706     std::string numgauss=to_string(i+1);
707     std:string nom2;
708     if (avectitre) nom2=nom+"_G"+numgauss;
709     if (avectitre) titre=titre+nom2+"_x;"+nom2+"_y;"+nom2+"_z;";
710     double val1=sol->lire(numno,j,0,i);
711     double val2=sol->lire(numno,j,1,i);
712     double val3=sol->lire(numno,j,2,i);
713     sprintf(chaine,"%le;%le;%le;",val1,val2,val3);
714     valeur=valeur+chaine;
715     }
716    
717     }
718     }
719     }
720 francois 778 for (int i=0;i<valeur.length();i++)
721     if (valeur[i]=='.') valeur[i]=separateur;
722 francois 757 if (avectitre)
723     return titre+"\n"+valeur;
724     return valeur;
725    
726    
727 francois 697 }