ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/fem_solution.cpp
Revision: 375
Committed: Fri Nov 9 15:27:14 2012 UTC (12 years, 6 months ago) by francois
File size: 11493 byte(s)
Log Message:
Solution FEM sont vectorielles et tensorielles + affichage des options de compilations dans les exe

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     int nb;
312 francois 375 for (int j=0;j<9;j++)
313     {
314     solmax[j]=-1e308;
315     solmin[j]=1e308;
316     }
317 francois 283 int i=0;
318 francois 375 if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_NOEUD)
319 francois 283 {
320     LISTE_FEM_NOEUD::iterator it;
321     for (FEM_NOEUD* no=femmai->get_premier_noeud(it);no!=NULL;no=femmai->get_suivant_noeud(it))
322     {
323 francois 375 for (int k=0;k<dim_solution;k++)
324     {
325     double val=lire(i,num,k);
326     no->change_solution(val,k);
327     if (val<solmin[k]) solmin[k]=val;
328     if (val>solmax[k]) solmax[k]=val;
329     }
330 francois 283 i++;
331     }
332     }
333 francois 375 if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT1)
334 francois 283 {
335 francois 309 LISTE_FEM_ELEMENT1::iterator it;
336     for (FEM_ELEMENT1* seg=femmai->get_premier_element1(it);seg!=NULL;seg=femmai->get_suivant_element1(it))
337 francois 283 {
338 francois 375 for (int k=0;k<dim_solution;k++)
339     {
340     double val=lire(i,num,k);
341     seg->change_solution(val,k);
342     if (val<solmin[k]) solmin[k]=val;
343     if (val>solmax[k]) solmax[k]=val;
344     }
345 francois 283 i++;
346     }
347     }
348 francois 375 if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2)
349 francois 283 {
350 francois 309 LISTE_FEM_ELEMENT2::iterator it;
351     for (FEM_ELEMENT2* tri=femmai->get_premier_element2(it);tri!=NULL;tri=femmai->get_suivant_element2(it))
352 francois 283 {
353 francois 375 for (int k=0;k<dim_solution;k++)
354     {
355     double val=lire(i,num);
356     tri->change_solution(val);
357     if (val<solmin[k]) solmin[k]=val;
358     if (val>solmax[k]) solmax[k]=val;
359     }
360 francois 283 i++;
361     }
362     }
363 francois 375 if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3)
364 francois 283 {
365 francois 309 LISTE_FEM_ELEMENT3::iterator it;
366     for (FEM_ELEMENT3* tet=femmai->get_premier_element3(it);tet!=NULL;tet=femmai->get_suivant_element3(it))
367 francois 283 {
368 francois 375 for (int k=0;k<dim_solution;k++)
369     {
370     double val=lire(i,num);
371     tet->change_solution(val);
372     if (val<solmin[k]) solmin[k]=val;
373     if (val>solmax[k]) solmax[k]=val;
374     }
375 francois 283 i++;
376     }
377     }
378 francois 375 for (int k=0;k<dim_solution;k++)
379     if (OPERATEUR::egal(fabs(solmin[k]-solmax[k]),0.,1e-10)==1)
380     solmax[k]=solmin[k]+1e-10;
381 francois 283 }
382    
383     std::string FEM_SOLUTION::get_nom(void)
384     {
385     return nomsolution;
386     }
387    
388 francois 326 std::string FEM_SOLUTION::get_nom_fichier(void)
389     {
390     return nom_fichier;
391     }
392 francois 283 void FEM_SOLUTION::enregistrer(std::ostream& o)
393     {
394 francois 375 o << "%" << get_id() << "=FEM_SOLUTION(" << typeentite << "," << dim_solution << "," << nomsolution << ",$" << femmai->get_id() << "," << nb_champs << "," << nom_fichier << ",(";
395 francois 283 for (int i=0;i<nb_champs;i++)
396     {
397     o << legende[i];
398     if (i!=nb_champs-1) o<<",";
399     else o<<")";
400     }
401    
402    
403     o << ");" << std::endl;
404     }
405    
406    
407    
408    
409     std::ostream& operator << (std::ostream& o,FEM_SOLUTION& sol)
410     {
411     sol.enregistrer(o);
412     return o;
413     }
414    
415