ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/mg_solution.cpp
Revision: 763
Committed: Wed Dec 2 19:55:53 2015 UTC (9 years, 5 months ago) by francois
File size: 13693 byte(s)
Log Message:
Le fichier MAGiC est maintenant versionné. LA version actuelle est 2.0. L'ancienne version est 1.0.
Tout est transparent pour l'utilisateur. Les vieilles versions sont lisibles mais les nouveaux enregistrements sont dans la version la plus récente.
Changement des conditions aux limites : ajout d'un parametre pour dire si la condition numerique est une valeur ou une formule ou un lien vers une autre entité magic.
Les parametres pour saisir sont maintenant -ccf -ccfi -ccff -ccft -ccfit -ccfft

File Contents

# User Rev Content
1 francois 283 //------------------------------------------------------------
2     //------------------------------------------------------------
3     // MAGiC
4     // Jean Christophe Cuilli�re et Vincent FRANCOIS
5     // D�partement de G�nie M�canique - UQTR
6     //------------------------------------------------------------
7     // Le projet MAGIC est un projet de recherche du d�partement
8     // de g�nie m�canique de l'Universit� du Qu�bec �
9     // Trois Rivi�res
10     // Les librairies ne peuvent �tre utilis�es sans l'accord
11     // des auteurs (contact : francois@uqtr.ca)
12     //------------------------------------------------------------
13     //------------------------------------------------------------
14     //
15     // mg_solution.cpp
16     //
17     //------------------------------------------------------------
18     //------------------------------------------------------------
19     // COPYRIGHT 2000
20     // Version du 02/03/2006 � 11H22
21     //------------------------------------------------------------
22     //------------------------------------------------------------
23    
24    
25     #include "gestionversion.h"
26     #include <math.h>
27     #include <iostream>
28     #include <stdlib.h>
29     #include <string.h>
30    
31     #include "mg_solution.h"
32     #include "mg_maillage.h"
33     #include "ot_mathematique.h"
34    
35    
36     #include <stdio.h> // pour la fonction remove() qui remplace DeleteFile
37    
38    
39    
40    
41    
42    
43 francois 377 MG_SOLUTION::MG_SOLUTION(MG_MAILLAGE* mai,int nb,char* chemin,int code,std::string nomsol,int entite,int type_solution):MG_IDENTIFICATEUR(),nb_champs(nb),mgmai(mai),nomsolution(nomsol),typeentite(entite),dim_solution(type_solution)
44 francois 283 {
45 francois 377 inisolution(chemin,code);
46 francois 283 }
47    
48 francois 377 MG_SOLUTION::MG_SOLUTION(unsigned long num,MG_MAILLAGE* mai,int nb,char* chemin,int code,std::string nomsol,int entite,int type_solution):MG_IDENTIFICATEUR(num),nb_champs(nb),mgmai(mai),nomsolution(nomsol),typeentite(entite),dim_solution(type_solution)
49 francois 283 {
50 francois 377 inisolution(chemin,code);
51 francois 283 }
52    
53     MG_SOLUTION::~MG_SOLUTION()
54     {
55     delete [] nom_fichier;
56     delete [] legende;
57     if (in!=NULL) fclose(in);
58     }
59    
60 francois 377
61     void MG_SOLUTION::inisolution(char* chemin,int code)
62     {
63     nom_fichier=new char[strlen(chemin)+2];
64     legende=new std::string[nb_champs];
65     for (int i=0;i<nb_champs;i++)
66     {
67     char mess[15];
68     sprintf(mess,"Champs_%d",i);
69     legende[i]=mess ;
70     }
71     strcpy(nom_fichier,chemin);
72     if (code!=0)
73     {
74     in=fopen(nom_fichier,"wb");
75     unsigned long nbele=0;
76     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_NOEUD) nbele=mgmai->get_nb_mg_noeud();
77     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT1) nbele=mgmai->get_nb_mg_segment();
78     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2) nbele=mgmai->get_nb_mg_triangle()+mgmai->get_nb_mg_quadrangle();
79     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3) nbele=mgmai->get_nb_mg_tetra()+mgmai->get_nb_mg_hexa();
80     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT1_NOEUD) nbele=mgmai->get_nb_mg_segment();
81     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2_NOEUD) nbele=mgmai->get_nb_mg_triangle()+mgmai->get_nb_mg_quadrangle();
82     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3_NOEUD) nbele=mgmai->get_nb_mg_tetra()+mgmai->get_nb_mg_hexa();
83     fwrite(&nbele,sizeof(unsigned long),1,in);
84     for (unsigned long i=0;i<nbele+1;i++)
85     {
86     unsigned long val=0;
87     fwrite(&val,sizeof(unsigned long),1,in);
88     }
89     unsigned long *tab=new unsigned long[nbele+1];
90     unsigned long i=0;
91     unsigned long cumul_iter=0;
92     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_NOEUD)
93     {
94     LISTE_MG_NOEUD::iterator ite;
95     for (MG_NOEUD* ele=mgmai->get_premier_noeud(ite);ele;ele=mgmai->get_suivant_noeud(ite))
96     {
97     tab[i]=cumul_iter;
98     unsigned long iter=1*nb_champs*dim_solution;
99     for (unsigned long j=0;j<iter;j++)
100     {
101     double val=0;
102     fwrite(&val,sizeof(double),1,in);
103     }
104     i++;
105     cumul_iter=cumul_iter+iter;
106     }
107    
108     }
109     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT1)
110     {
111     LISTE_MG_SEGMENT::iterator ite;
112     for (MG_SEGMENT* ele=mgmai->get_premier_segment(ite);ele;ele=mgmai->get_suivant_segment(ite))
113     {
114     tab[i]=cumul_iter;
115     unsigned long iter=1*nb_champs*dim_solution;
116     for (unsigned long j=0;j<iter;j++)
117     {
118     double val=0;
119     fwrite(&val,sizeof(double),1,in);
120     }
121     i++;
122     cumul_iter=cumul_iter+iter;
123     }
124    
125     }
126     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2)
127     {
128     LISTE_MG_TRIANGLE::iterator itet;
129     for (MG_TRIANGLE* ele=mgmai->get_premier_triangle(itet);ele;ele=mgmai->get_suivant_triangle(itet))
130     {
131     tab[i]=cumul_iter;
132     unsigned long iter=1*nb_champs*dim_solution;
133     for (unsigned long j=0;j<iter;j++)
134     {
135     double val=0;
136     fwrite(&val,sizeof(double),1,in);
137     }
138     i++;
139     cumul_iter=cumul_iter+iter;
140     }
141     LISTE_MG_QUADRANGLE::iterator iteq;
142     for (MG_QUADRANGLE* ele=mgmai->get_premier_quadrangle(iteq);ele;ele=mgmai->get_suivant_quadrangle(iteq))
143     {
144     tab[i]=cumul_iter;
145     unsigned long iter=1*nb_champs*dim_solution;
146     for (unsigned long j=0;j<iter;j++)
147     {
148     double val=0;
149     fwrite(&val,sizeof(double),1,in);
150     }
151     i++;
152     cumul_iter=cumul_iter+iter;
153     }
154    
155     }
156     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3)
157     {
158     LISTE_MG_TETRA::iterator itet;
159     for (MG_TETRA* ele=mgmai->get_premier_tetra(itet);ele;ele=mgmai->get_suivant_tetra(itet))
160     {
161     tab[i]=cumul_iter;
162     unsigned long iter=1*nb_champs*dim_solution;
163     for (unsigned long j=0;j<iter;j++)
164     {
165     double val=0;
166     fwrite(&val,sizeof(double),1,in);
167     }
168     i++;
169     cumul_iter=cumul_iter+iter;
170     }
171    
172     LISTE_MG_HEXA::iterator iteh;
173     for (MG_HEXA* ele=mgmai->get_premier_hexa(iteh);ele;ele=mgmai->get_suivant_hexa(iteh))
174     {
175     tab[i]=cumul_iter;
176     unsigned long iter=1*nb_champs*dim_solution;
177     for (unsigned long j=0;j<iter;j++)
178     {
179     double val=0;
180     fwrite(&val,sizeof(double),1,in);
181     }
182     i++;
183     cumul_iter=cumul_iter+iter;
184     }
185    
186     }
187     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3_NOEUD)
188     {
189     LISTE_MG_TETRA::iterator itet;
190     for (MG_TETRA* ele=mgmai->get_premier_tetra(itet);ele;ele=mgmai->get_suivant_tetra(itet))
191     {
192     tab[i]=cumul_iter;
193     unsigned long iter=4*nb_champs*dim_solution;
194     for (unsigned long j=0;j<iter;j++)
195     {
196     double val=0;
197     fwrite(&val,sizeof(double),1,in);
198     }
199     i++;
200     cumul_iter=cumul_iter+iter;
201     }
202     LISTE_MG_HEXA::iterator iteh;
203     for (MG_HEXA* ele=mgmai->get_premier_hexa(iteh);ele;ele=mgmai->get_suivant_hexa(iteh))
204     {
205     tab[i]=cumul_iter;
206     unsigned long iter=8*nb_champs*dim_solution;
207     for (unsigned long j=0;j<iter;j++)
208     {
209     double val=0;
210     fwrite(&val,sizeof(double),1,in);
211     }
212     i++;
213     cumul_iter=cumul_iter+iter;
214     }
215     }
216     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT1_NOEUD)
217     {
218     LISTE_MG_SEGMENT::iterator ite;
219     for (MG_SEGMENT* ele=mgmai->get_premier_segment(ite);ele;ele=mgmai->get_suivant_segment(ite))
220     {
221     tab[i]=cumul_iter;
222     unsigned long iter=2*nb_champs*dim_solution;
223     for (unsigned long j=0;j<iter;j++)
224     {
225     double val=0;
226     fwrite(&val,sizeof(double),1,in);
227     }
228     i++;
229     cumul_iter=cumul_iter+iter;
230     }
231    
232     }
233     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2_NOEUD)
234     {
235     LISTE_MG_TRIANGLE::iterator itet;
236     for (MG_TRIANGLE* ele=mgmai->get_premier_triangle(itet);ele;ele=mgmai->get_suivant_triangle(itet))
237     {
238     tab[i]=cumul_iter;
239     unsigned long iter=3*nb_champs*dim_solution;
240     for (unsigned long j=0;j<iter;j++)
241     {
242     double val=0;
243     fwrite(&val,sizeof(double),1,in);
244     }
245     i++;
246     cumul_iter=cumul_iter+iter;
247     }
248     LISTE_MG_QUADRANGLE::iterator iteq;
249     for (MG_QUADRANGLE* ele=mgmai->get_premier_quadrangle(iteq);ele;ele=mgmai->get_suivant_quadrangle(iteq))
250     {
251     tab[i]=cumul_iter;
252     unsigned long iter=4*nb_champs*dim_solution;
253     for (unsigned long j=0;j<iter;j++)
254     {
255     double val=0;
256     fwrite(&val,sizeof(double),1,in);
257     }
258     i++;
259     cumul_iter=cumul_iter+iter;
260     }
261    
262     }
263     tab[nbele]=cumul_iter;
264     fseek(in,sizeof(unsigned long),SEEK_SET);
265     for (unsigned long i=0;i<nbele+1;i++)
266     {
267     unsigned long val=0;
268     fwrite(&(tab[i]),sizeof(unsigned long),1,in);
269     }
270     delete [] tab;
271     fclose(in);
272     }
273     in=fopen(nom_fichier,"r+b");
274     hash.clear();
275     fseek(in,0,SEEK_SET);
276     unsigned long nb;
277     fread(&nb,sizeof(unsigned long),1,in);
278     hash.insert(hash.end(),nb);
279     for (unsigned long i=0;i<nb+1;i++)
280     {
281     unsigned long val;
282     fread(&val,sizeof(unsigned long),1,in);
283     hash.insert(hash.end(),val);
284     }
285     }
286    
287    
288 francois 283 void MG_SOLUTION::efface(void)
289     {
290     fclose(in);
291     remove(nom_fichier);
292     // DeleteFile(nom_fichier);
293     in=NULL;
294     }
295    
296 francois 377
297    
298     double MG_SOLUTION::lire(int i,int j,int coord,int num_no)
299 francois 283 {
300 francois 377 unsigned long nb=hash[0];
301     unsigned long pos=hash[i+1];
302     unsigned long pospro=hash[i+2];
303     int nbval=(pospro-pos)/nb_champs/dim_solution;
304     long posval=(nb+2)*sizeof(unsigned long)+(pos+j*dim_solution*nbval+num_no*dim_solution+coord)*sizeof(double);
305     fseek(in,posval,SEEK_SET);
306 francois 283 double val;
307 francois 377 fread(&val,sizeof(double),1,in);
308 francois 283 return (val);
309     }
310    
311 francois 377 void MG_SOLUTION::ecrire(double val,int i,int j,int coord,int num_no)
312 francois 283 {
313 francois 377 unsigned long nb=hash[0];
314     unsigned long pos=hash[i+1];
315     unsigned long pospro=hash[i+2];
316     int nbval=(pospro-pos)/nb_champs/dim_solution;
317     long posval=(nb+2)*sizeof(unsigned long)+(pos+j*dim_solution*nbval+num_no*dim_solution+coord)*sizeof(double);
318     fseek(in,posval,SEEK_SET);
319 francois 283 fwrite(&val,sizeof(double),1,in);
320     fflush(in);
321     }
322    
323    
324 francois 377
325     int MG_SOLUTION::get_dim_solution(void)
326     {
327     return dim_solution;
328     }
329    
330 francois 283 void MG_SOLUTION::change_legende(int num,std::string val)
331     {
332     legende[num]=val;
333     }
334    
335     std::string MG_SOLUTION::get_legende(int num)
336     {
337     return legende[num];
338     }
339    
340     int MG_SOLUTION::get_nb_champ(void)
341     {
342     return nb_champs;
343     }
344    
345     MG_MAILLAGE* MG_SOLUTION::get_maillage(void)
346     {
347     return mgmai;
348     }
349    
350 francois 377 double MG_SOLUTION::get_legende_min(int num)
351 francois 283 {
352 francois 377 return solmin[num];
353 francois 283 }
354    
355 francois 377 double MG_SOLUTION::get_legende_max(int num)
356 francois 283 {
357 francois 377 return solmax[num];
358 francois 283 }
359    
360     void MG_SOLUTION::active_solution(int num)
361     {
362     int nb;
363 francois 377 for (int j=0;j<9;j++)
364     {
365     solmax[j]=-1e308;
366     solmin[j]=1e308;
367     }
368 francois 283 int i=0;
369 francois 375 if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_NOEUD)
370 francois 283 {
371     LISTE_MG_NOEUD::iterator it;
372     for (MG_NOEUD* no=mgmai->get_premier_noeud(it);no!=NULL;no=mgmai->get_suivant_noeud(it))
373     {
374 francois 377 for (int k=0;k<dim_solution;k++)
375     {
376     double val=lire(i,num,k);
377     no->change_solution(val,k);
378     if (val<solmin[k]) solmin[k]=val;
379     if (val>solmax[k]) solmax[k]=val;
380     }
381 francois 283 i++;
382     }
383     }
384 francois 375 if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT1)
385 francois 283 {
386     LISTE_MG_SEGMENT::iterator it;
387     for (MG_SEGMENT* seg=mgmai->get_premier_segment(it);seg!=NULL;seg=mgmai->get_suivant_segment(it))
388     {
389 francois 377 for (int k=0;k<dim_solution;k++)
390     {
391     double val=lire(i,num,k);
392     seg->change_solution(val,k);
393     if (val<solmin[k]) solmin[k]=val;
394     if (val>solmax[k]) solmax[k]=val;
395     }
396 francois 283 i++;
397     }
398     }
399 francois 375 if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2)
400 francois 283 {
401     LISTE_MG_TRIANGLE::iterator it;
402     for (MG_TRIANGLE* tri=mgmai->get_premier_triangle(it);tri!=NULL;tri=mgmai->get_suivant_triangle(it))
403     {
404 francois 377 for (int k=0;k<dim_solution;k++)
405     {
406     double val=lire(i,num,k);
407     tri->change_solution(val,k);
408     if (val<solmin[k]) solmin[k]=val;
409     if (val>solmax[k]) solmax[k]=val;
410     }
411 francois 283 i++;
412     }
413 francois 308 LISTE_MG_QUADRANGLE::iterator it2;
414     for (MG_QUADRANGLE* quad=mgmai->get_premier_quadrangle(it2);quad!=NULL;quad=mgmai->get_suivant_quadrangle(it2))
415     {
416 francois 377 for (int k=0;k<dim_solution;k++)
417     {
418     double val=lire(i,num,k);
419     quad->change_solution(val,k);
420     if (val<solmin[k]) solmin[k]=val;
421     if (val>solmax[k]) solmax[k]=val;
422     }
423 francois 308 i++;
424     }
425 francois 283 }
426 francois 375 if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3)
427 francois 283 {
428     LISTE_MG_TETRA::iterator it;
429     for (MG_TETRA* tet=mgmai->get_premier_tetra(it);tet!=NULL;tet=mgmai->get_suivant_tetra(it))
430     {
431 francois 377 for (int k=0;k<dim_solution;k++)
432     {
433     double val=lire(i,num,k);
434     tet->change_solution(val,k);
435     if (val<solmin[k]) solmin[k]=val;
436     if (val>solmax[k]) solmax[k]=val;
437     }
438 francois 283 i++;
439     }
440 francois 308 LISTE_MG_HEXA::iterator it2;
441     for (MG_HEXA* hex=mgmai->get_premier_hexa(it2);hex!=NULL;hex=mgmai->get_suivant_hexa(it2))
442     {
443 francois 377 for (int k=0;k<dim_solution;k++)
444     {
445     double val=lire(i,num,k);
446     hex->change_solution(val,k);
447     if (val<solmin[k]) solmin[k]=val;
448     if (val>solmax[k]) solmax[k]=val;
449     }
450 francois 308 i++;
451     }
452 francois 283 }
453 francois 377 for (int k=0;k<dim_solution;k++)
454     if (OPERATEUR::egal(fabs(solmin[k]-solmax[k]),0.,1e-10)==1)
455     solmax[k]=solmin[k]+1e-10;
456 francois 283 }
457    
458     std::string MG_SOLUTION::get_nom(void)
459     {
460     return nomsolution;
461     }
462 francois 326 std::string MG_SOLUTION::get_nom_fichier(void)
463     {
464     return nom_fichier;
465     }
466 francois 763 void MG_SOLUTION::enregistrer(std::ostream& o,double version)
467 francois 283 {
468 francois 377 o << "%" << get_id() << "=SOLUTION(" << typeentite << "," << dim_solution << "," << nomsolution << ",$" << mgmai->get_id() << "," << nb_champs << "," << nom_fichier << ",(";
469 francois 283 for (int i=0;i<nb_champs;i++)
470     {
471     o << legende[i];
472     if (i!=nb_champs-1) o<<",";
473     else o<<")";
474     }
475    
476    
477     o << ");" << std::endl;
478     }
479    
480 francois 635 int MG_SOLUTION::get_entite_solution(void)
481 francois 283 {
482     return typeentite;
483     }
484    
485    
486    
487     std::ostream& operator << (std::ostream& o,MG_SOLUTION& sol)
488     {
489 francois 763 sol.enregistrer(o,VERSIONFICHIER);
490 francois 283 return o;
491     }
492    
493