ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/fem_solution.cpp
Revision: 377
Committed: Thu Nov 15 15:23:45 2012 UTC (12 years, 5 months ago) by francois
File size: 11481 byte(s)
Log Message:
Les solution mg sont aussi vectorielles

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     // fem_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 "fem_solution.h"
32     #include "fem_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 375 FEM_SOLUTION::FEM_SOLUTION(FEM_MAILLAGE* mai,int nb,char* chemin,int code,std::string nomsol,int entite,int type_solution):MG_IDENTIFICATEUR(),nb_champs(nb),femmai(mai),nomsolution(nomsol),typeentite(entite),dim_solution(type_solution)
44 francois 283 {
45 francois 375 inisolution(chemin,code);
46 francois 283 }
47    
48 francois 375 FEM_SOLUTION::FEM_SOLUTION(unsigned long num,FEM_MAILLAGE* mai,int nb,char* chemin,int code,std::string nomsol,int entite,int type_solution):MG_IDENTIFICATEUR(num),nb_champs(nb),femmai(mai),nomsolution(nomsol),typeentite(entite),dim_solution(type_solution)
49 francois 283 {
50 francois 375 inisolution(chemin,code);
51    
52     }
53    
54     void FEM_SOLUTION::inisolution(char* chemin,int code)
55     {
56     nom_fichier=new char[strlen(chemin)+2];
57     legende=new std::string[nb_champs];
58     for (int i=0;i<nb_champs;i++)
59     {
60     char mess[15];
61     sprintf(mess,"Champs_%d",i);
62     legende[i]=mess ;
63     }
64     strcpy(nom_fichier,chemin);
65     if (code!=0)
66 francois 283 {
67     in=fopen(nom_fichier,"wb");
68 francois 375 unsigned long nbele=0;
69     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_NOEUD) nbele=femmai->get_nb_fem_noeud();
70     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT1) nbele=femmai->get_nb_fem_element1();
71     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2) nbele=femmai->get_nb_fem_element2();
72     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3) nbele=femmai->get_nb_fem_element3();
73     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT1_NOEUD) nbele=femmai->get_nb_fem_element1();
74     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2_NOEUD) nbele=femmai->get_nb_fem_element2();
75     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3_NOEUD) nbele=femmai->get_nb_fem_element3();
76     fwrite(&nbele,sizeof(unsigned long),1,in);
77     for (unsigned long i=0;i<nbele+1;i++)
78     {
79     unsigned long val=0;
80     fwrite(&val,sizeof(unsigned long),1,in);
81     }
82     unsigned long *tab=new unsigned long[nbele+1];
83     unsigned long i=0;
84     unsigned long cumul_iter=0;
85     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_NOEUD)
86     {
87     LISTE_FEM_NOEUD::iterator ite;
88     for (FEM_NOEUD* ele=femmai->get_premier_noeud(ite);ele;ele=femmai->get_suivant_noeud(ite))
89     {
90     tab[i]=cumul_iter;
91     unsigned long iter=1*nb_champs*dim_solution;
92     for (unsigned long j=0;j<iter;j++)
93     {
94     double val=0;
95     fwrite(&val,sizeof(double),1,in);
96     }
97     i++;
98     cumul_iter=cumul_iter+iter;
99     }
100    
101     }
102     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT1)
103     {
104     LISTE_FEM_ELEMENT1::iterator ite;
105     for (FEM_ELEMENT1* ele=femmai->get_premier_element1(ite);ele;ele=femmai->get_suivant_element1(ite))
106     {
107     tab[i]=cumul_iter;
108     unsigned long iter=1*nb_champs*dim_solution;
109     for (unsigned long j=0;j<iter;j++)
110     {
111     double val=0;
112     fwrite(&val,sizeof(double),1,in);
113     }
114     i++;
115     cumul_iter=cumul_iter+iter;
116     }
117    
118     }
119     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2)
120     {
121     LISTE_FEM_ELEMENT2::iterator ite;
122     for (FEM_ELEMENT2* ele=femmai->get_premier_element2(ite);ele;ele=femmai->get_suivant_element2(ite))
123     {
124     tab[i]=cumul_iter;
125     unsigned long iter=1*nb_champs*dim_solution;
126     for (unsigned long j=0;j<iter;j++)
127     {
128     double val=0;
129     fwrite(&val,sizeof(double),1,in);
130     }
131     i++;
132     cumul_iter=cumul_iter+iter;
133     }
134    
135     }
136     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3)
137     {
138     LISTE_FEM_ELEMENT3::iterator ite;
139     for (FEM_ELEMENT3* ele=femmai->get_premier_element3(ite);ele;ele=femmai->get_suivant_element3(ite))
140     {
141     tab[i]=cumul_iter;
142     unsigned long iter=1*nb_champs*dim_solution;
143     for (unsigned long j=0;j<iter;j++)
144     {
145     double val=0;
146     fwrite(&val,sizeof(double),1,in);
147     }
148     i++;
149     cumul_iter=cumul_iter+iter;
150     }
151    
152     }
153     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3_NOEUD)
154     {
155     LISTE_FEM_ELEMENT3::iterator ite;
156     for (FEM_ELEMENT3* ele=femmai->get_premier_element3(ite);ele;ele=femmai->get_suivant_element3(ite))
157     {
158     tab[i]=cumul_iter;
159     unsigned long iter=ele->get_nb_fem_noeud()*nb_champs*dim_solution;
160     for (unsigned long j=0;j<iter;j++)
161     {
162     double val=0;
163     fwrite(&val,sizeof(double),1,in);
164     }
165     i++;
166     cumul_iter=cumul_iter+iter;
167     }
168    
169     }
170     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT1_NOEUD)
171     {
172     LISTE_FEM_ELEMENT1::iterator ite;
173     for (FEM_ELEMENT1* ele=femmai->get_premier_element1(ite);ele;ele=femmai->get_suivant_element1(ite))
174     {
175     tab[i]=cumul_iter;
176     unsigned long iter=ele->get_nb_fem_noeud()*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_ELEMENT2_NOEUD)
188     {
189     LISTE_FEM_ELEMENT2::iterator ite;
190     for (FEM_ELEMENT2* ele=femmai->get_premier_element2(ite);ele;ele=femmai->get_suivant_element2(ite))
191     {
192     tab[i]=cumul_iter;
193     unsigned long iter=ele->get_nb_fem_noeud()*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    
203     }
204     tab[nbele]=cumul_iter;
205     fseek(in,sizeof(unsigned long),SEEK_SET);
206     for (unsigned long i=0;i<nbele+1;i++)
207     {
208     unsigned long val=0;
209     fwrite(&(tab[i]),sizeof(unsigned long),1,in);
210     }
211     delete [] tab;
212 francois 283 fclose(in);
213     }
214     in=fopen(nom_fichier,"r+b");
215 francois 375 hash.clear();
216     fseek(in,0,SEEK_SET);
217     unsigned long nb;
218     fread(&nb,sizeof(unsigned long),1,in);
219     hash.insert(hash.end(),nb);
220     for (unsigned long i=0;i<nb+1;i++)
221     {
222     unsigned long val;
223     fread(&val,sizeof(unsigned long),1,in);
224     hash.insert(hash.end(),val);
225     }
226 francois 283 }
227    
228 francois 375
229    
230 francois 283 FEM_SOLUTION::~FEM_SOLUTION()
231     {
232     delete [] nom_fichier;
233     delete [] legende;
234     if (in!=NULL) fclose(in);
235     }
236    
237     void FEM_SOLUTION::efface(void)
238     {
239     fclose(in);
240     remove(nom_fichier);
241     // DeleteFile(nom_fichier);
242     in=NULL;
243     }
244    
245     int FEM_SOLUTION::get_type_solution(void)
246     {
247     return typeentite;
248     }
249    
250 francois 375 double FEM_SOLUTION::lire(int i,int j,int coord,int num_no)
251 francois 283 {
252 francois 375 unsigned long nb=hash[0];
253     unsigned long pos=hash[i+1];
254     unsigned long pospro=hash[i+2];
255     int nbval=(pospro-pos)/nb_champs/dim_solution;
256     long posval=(nb+2)*sizeof(unsigned long)+(pos+j*dim_solution*nbval+num_no*dim_solution+coord)*sizeof(double);
257     fseek(in,posval,SEEK_SET);
258 francois 283 double val;
259 francois 375 fread(&val,sizeof(double),1,in);
260 francois 283 return (val);
261     }
262    
263 francois 375 void FEM_SOLUTION::ecrire(double val,int i,int j,int coord,int num_no)
264 francois 283 {
265 francois 375 unsigned long nb=hash[0];
266     unsigned long pos=hash[i+1];
267     unsigned long pospro=hash[i+2];
268     int nbval=(pospro-pos)/nb_champs/dim_solution;
269     long posval=(nb+2)*sizeof(unsigned long)+(pos+j*dim_solution*nbval+num_no*dim_solution+coord)*sizeof(double);
270     fseek(in,posval,SEEK_SET);
271 francois 283 fwrite(&val,sizeof(double),1,in);
272     fflush(in);
273     }
274    
275    
276     void FEM_SOLUTION::change_legende(int num,std::string val)
277     {
278     legende[num]=val;
279     }
280    
281     std::string FEM_SOLUTION::get_legende(int num)
282     {
283     return legende[num];
284     }
285    
286     int FEM_SOLUTION::get_nb_champ(void)
287     {
288     return nb_champs;
289     }
290    
291     FEM_MAILLAGE* FEM_SOLUTION::get_maillage(void)
292     {
293     return femmai;
294     }
295    
296 francois 375 double FEM_SOLUTION::get_legende_min(int num)
297 francois 283 {
298 francois 375 return solmin[num];
299 francois 283 }
300    
301 francois 375 double FEM_SOLUTION::get_legende_max(int num)
302 francois 283 {
303 francois 375 return solmax[num];
304 francois 283 }
305 francois 375 int FEM_SOLUTION::get_dim_solution(void)
306     {
307     return dim_solution;
308     }
309 francois 283 void FEM_SOLUTION::active_solution(int num)
310     {
311 francois 375 for (int j=0;j<9;j++)
312     {
313     solmax[j]=-1e308;
314     solmin[j]=1e308;
315     }
316 francois 283 int i=0;
317 francois 375 if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_NOEUD)
318 francois 283 {
319     LISTE_FEM_NOEUD::iterator it;
320     for (FEM_NOEUD* no=femmai->get_premier_noeud(it);no!=NULL;no=femmai->get_suivant_noeud(it))
321     {
322 francois 375 for (int k=0;k<dim_solution;k++)
323     {
324     double val=lire(i,num,k);
325     no->change_solution(val,k);
326     if (val<solmin[k]) solmin[k]=val;
327     if (val>solmax[k]) solmax[k]=val;
328     }
329 francois 283 i++;
330     }
331     }
332 francois 375 if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT1)
333 francois 283 {
334 francois 309 LISTE_FEM_ELEMENT1::iterator it;
335     for (FEM_ELEMENT1* seg=femmai->get_premier_element1(it);seg!=NULL;seg=femmai->get_suivant_element1(it))
336 francois 283 {
337 francois 375 for (int k=0;k<dim_solution;k++)
338     {
339     double val=lire(i,num,k);
340     seg->change_solution(val,k);
341     if (val<solmin[k]) solmin[k]=val;
342     if (val>solmax[k]) solmax[k]=val;
343     }
344 francois 283 i++;
345     }
346     }
347 francois 375 if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2)
348 francois 283 {
349 francois 309 LISTE_FEM_ELEMENT2::iterator it;
350     for (FEM_ELEMENT2* tri=femmai->get_premier_element2(it);tri!=NULL;tri=femmai->get_suivant_element2(it))
351 francois 283 {
352 francois 375 for (int k=0;k<dim_solution;k++)
353     {
354     double val=lire(i,num);
355     tri->change_solution(val);
356     if (val<solmin[k]) solmin[k]=val;
357     if (val>solmax[k]) solmax[k]=val;
358     }
359 francois 283 i++;
360     }
361     }
362 francois 375 if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3)
363 francois 283 {
364 francois 309 LISTE_FEM_ELEMENT3::iterator it;
365     for (FEM_ELEMENT3* tet=femmai->get_premier_element3(it);tet!=NULL;tet=femmai->get_suivant_element3(it))
366 francois 283 {
367 francois 375 for (int k=0;k<dim_solution;k++)
368     {
369     double val=lire(i,num);
370     tet->change_solution(val);
371     if (val<solmin[k]) solmin[k]=val;
372     if (val>solmax[k]) solmax[k]=val;
373     }
374 francois 283 i++;
375     }
376     }
377 francois 375 for (int k=0;k<dim_solution;k++)
378     if (OPERATEUR::egal(fabs(solmin[k]-solmax[k]),0.,1e-10)==1)
379     solmax[k]=solmin[k]+1e-10;
380 francois 283 }
381    
382     std::string FEM_SOLUTION::get_nom(void)
383     {
384     return nomsolution;
385     }
386    
387 francois 326 std::string FEM_SOLUTION::get_nom_fichier(void)
388     {
389     return nom_fichier;
390     }
391 francois 283 void FEM_SOLUTION::enregistrer(std::ostream& o)
392     {
393 francois 375 o << "%" << get_id() << "=FEM_SOLUTION(" << typeentite << "," << dim_solution << "," << nomsolution << ",$" << femmai->get_id() << "," << nb_champs << "," << nom_fichier << ",(";
394 francois 283 for (int i=0;i<nb_champs;i++)
395     {
396     o << legende[i];
397     if (i!=nb_champs-1) o<<",";
398     else o<<")";
399     }
400    
401    
402     o << ");" << std::endl;
403     }
404    
405    
406    
407    
408     std::ostream& operator << (std::ostream& o,FEM_SOLUTION& sol)
409     {
410     sol.enregistrer(o);
411     return o;
412     }
413    
414