ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/fem_solution.cpp
Revision: 757
Committed: Fri Nov 6 13:42:55 2015 UTC (9 years, 6 months ago) by francois
File size: 14253 byte(s)
Log Message:
Possibilite de calculer les comtraintes et les deformations aux points de gauss
Tester en elasticite volumique

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 francois 757 if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT1_GAUSS) nbele=femmai->get_nb_fem_element1();
77     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2_GAUSS) nbele=femmai->get_nb_fem_element2();
78     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3_GAUSS) nbele=femmai->get_nb_fem_element3();
79 francois 375 fwrite(&nbele,sizeof(unsigned long),1,in);
80     for (unsigned long i=0;i<nbele+1;i++)
81     {
82     unsigned long val=0;
83     fwrite(&val,sizeof(unsigned long),1,in);
84     }
85     unsigned long *tab=new unsigned long[nbele+1];
86     unsigned long i=0;
87     unsigned long cumul_iter=0;
88     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_NOEUD)
89     {
90     LISTE_FEM_NOEUD::iterator ite;
91     for (FEM_NOEUD* ele=femmai->get_premier_noeud(ite);ele;ele=femmai->get_suivant_noeud(ite))
92     {
93     tab[i]=cumul_iter;
94     unsigned long iter=1*nb_champs*dim_solution;
95     for (unsigned long j=0;j<iter;j++)
96     {
97     double val=0;
98     fwrite(&val,sizeof(double),1,in);
99     }
100     i++;
101     cumul_iter=cumul_iter+iter;
102     }
103    
104     }
105     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT1)
106     {
107     LISTE_FEM_ELEMENT1::iterator ite;
108     for (FEM_ELEMENT1* ele=femmai->get_premier_element1(ite);ele;ele=femmai->get_suivant_element1(ite))
109     {
110     tab[i]=cumul_iter;
111     unsigned long iter=1*nb_champs*dim_solution;
112     for (unsigned long j=0;j<iter;j++)
113     {
114     double val=0;
115     fwrite(&val,sizeof(double),1,in);
116     }
117     i++;
118     cumul_iter=cumul_iter+iter;
119     }
120    
121     }
122     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2)
123     {
124     LISTE_FEM_ELEMENT2::iterator ite;
125     for (FEM_ELEMENT2* ele=femmai->get_premier_element2(ite);ele;ele=femmai->get_suivant_element2(ite))
126     {
127     tab[i]=cumul_iter;
128     unsigned long iter=1*nb_champs*dim_solution;
129     for (unsigned long j=0;j<iter;j++)
130     {
131     double val=0;
132     fwrite(&val,sizeof(double),1,in);
133     }
134     i++;
135     cumul_iter=cumul_iter+iter;
136     }
137    
138     }
139     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3)
140     {
141     LISTE_FEM_ELEMENT3::iterator ite;
142     for (FEM_ELEMENT3* ele=femmai->get_premier_element3(ite);ele;ele=femmai->get_suivant_element3(ite))
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_NOEUD)
157     {
158     LISTE_FEM_ELEMENT3::iterator ite;
159     for (FEM_ELEMENT3* ele=femmai->get_premier_element3(ite);ele;ele=femmai->get_suivant_element3(ite))
160     {
161     tab[i]=cumul_iter;
162     unsigned long iter=ele->get_nb_fem_noeud()*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     }
173     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT1_NOEUD)
174     {
175     LISTE_FEM_ELEMENT1::iterator ite;
176     for (FEM_ELEMENT1* ele=femmai->get_premier_element1(ite);ele;ele=femmai->get_suivant_element1(ite))
177     {
178     tab[i]=cumul_iter;
179     unsigned long iter=ele->get_nb_fem_noeud()*nb_champs*dim_solution;
180     for (unsigned long j=0;j<iter;j++)
181     {
182     double val=0;
183     fwrite(&val,sizeof(double),1,in);
184     }
185     i++;
186     cumul_iter=cumul_iter+iter;
187     }
188    
189     }
190     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2_NOEUD)
191     {
192     LISTE_FEM_ELEMENT2::iterator ite;
193     for (FEM_ELEMENT2* ele=femmai->get_premier_element2(ite);ele;ele=femmai->get_suivant_element2(ite))
194     {
195     tab[i]=cumul_iter;
196     unsigned long iter=ele->get_nb_fem_noeud()*nb_champs*dim_solution;
197     for (unsigned long j=0;j<iter;j++)
198     {
199     double val=0;
200     fwrite(&val,sizeof(double),1,in);
201     }
202     i++;
203     cumul_iter=cumul_iter+iter;
204     }
205    
206     }
207 francois 757 if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3_GAUSS)
208     {
209     LISTE_FEM_ELEMENT3::iterator ite;
210     for (FEM_ELEMENT3* ele=femmai->get_premier_element3(ite);ele;ele=femmai->get_suivant_element3(ite))
211     {
212     tab[i]=cumul_iter;
213     unsigned long iter=1*nb_champs*dim_solution;
214     /*for (unsigned long j=0;j<iter;j++)
215     {
216     double val=0;
217     fwrite(&val,sizeof(double),1,in);
218     }*/
219     i++;
220     cumul_iter=cumul_iter+iter;
221     }
222    
223     }
224     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2_GAUSS)
225     {
226     LISTE_FEM_ELEMENT2::iterator ite;
227     for (FEM_ELEMENT2* ele=femmai->get_premier_element2(ite);ele;ele=femmai->get_suivant_element2(ite))
228     {
229     tab[i]=cumul_iter;
230     unsigned long iter=1*nb_champs*dim_solution;
231     /*for (unsigned long j=0;j<iter;j++)
232     {
233     double val=0;
234     fwrite(&val,sizeof(double),1,in);
235     }*/
236     i++;
237     cumul_iter=cumul_iter+iter;
238     }
239    
240     }
241     if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT1_GAUSS)
242     {
243     LISTE_FEM_ELEMENT1::iterator ite;
244     for (FEM_ELEMENT1* ele=femmai->get_premier_element1(ite);ele;ele=femmai->get_suivant_element1(ite))
245     {
246     tab[i]=cumul_iter;
247     unsigned long iter=1*nb_champs*dim_solution;
248     /*for (unsigned long j=0;j<iter;j++)
249     {
250     double val=0;
251     fwrite(&val,sizeof(double),1,in);
252     }*/
253     i++;
254     cumul_iter=cumul_iter+iter;
255     }
256    
257     }
258 francois 375 tab[nbele]=cumul_iter;
259     fseek(in,sizeof(unsigned long),SEEK_SET);
260     for (unsigned long i=0;i<nbele+1;i++)
261     {
262     unsigned long val=0;
263     fwrite(&(tab[i]),sizeof(unsigned long),1,in);
264     }
265     delete [] tab;
266 francois 283 fclose(in);
267     }
268     in=fopen(nom_fichier,"r+b");
269 francois 375 hash.clear();
270     fseek(in,0,SEEK_SET);
271     unsigned long nb;
272     fread(&nb,sizeof(unsigned long),1,in);
273     hash.insert(hash.end(),nb);
274     for (unsigned long i=0;i<nb+1;i++)
275     {
276     unsigned long val;
277     fread(&val,sizeof(unsigned long),1,in);
278     hash.insert(hash.end(),val);
279     }
280 francois 283 }
281    
282 francois 375
283    
284 francois 283 FEM_SOLUTION::~FEM_SOLUTION()
285     {
286     delete [] nom_fichier;
287     delete [] legende;
288     if (in!=NULL) fclose(in);
289     }
290    
291     void FEM_SOLUTION::efface(void)
292     {
293     fclose(in);
294     remove(nom_fichier);
295     // DeleteFile(nom_fichier);
296     in=NULL;
297     }
298    
299 francois 635 int FEM_SOLUTION::get_entite_solution(void)
300 francois 283 {
301     return typeentite;
302     }
303    
304 francois 375 double FEM_SOLUTION::lire(int i,int j,int coord,int num_no)
305 francois 283 {
306 francois 375 unsigned long nb=hash[0];
307     unsigned long pos=hash[i+1];
308     unsigned long pospro=hash[i+2];
309     int nbval=(pospro-pos)/nb_champs/dim_solution;
310     long posval=(nb+2)*sizeof(unsigned long)+(pos+j*dim_solution*nbval+num_no*dim_solution+coord)*sizeof(double);
311     fseek(in,posval,SEEK_SET);
312 francois 283 double val;
313 francois 375 fread(&val,sizeof(double),1,in);
314 francois 283 return (val);
315     }
316    
317 francois 375 void FEM_SOLUTION::ecrire(double val,int i,int j,int coord,int num_no)
318 francois 283 {
319 francois 375 unsigned long nb=hash[0];
320     unsigned long pos=hash[i+1];
321     unsigned long pospro=hash[i+2];
322     int nbval=(pospro-pos)/nb_champs/dim_solution;
323     long posval=(nb+2)*sizeof(unsigned long)+(pos+j*dim_solution*nbval+num_no*dim_solution+coord)*sizeof(double);
324     fseek(in,posval,SEEK_SET);
325 francois 283 fwrite(&val,sizeof(double),1,in);
326     fflush(in);
327     }
328    
329 francois 757 void FEM_SOLUTION::change_nb_gauss(int i,int num)
330     {
331     if ((typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT1_GAUSS)||(typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2_GAUSS)||(typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3_GAUSS))
332     {
333     unsigned long nb=hash[0];
334     unsigned long pos=hash[i+1];
335     unsigned long oldpospro=hash[i+2];
336     unsigned long pospro=num*nb_champs*dim_solution+pos;
337     hash[i+2]=pospro;
338     unsigned long decalage=pospro-oldpospro;
339     for (unsigned long j=i+3;j<nb+1;j++)
340     hash[j]=hash[j]+decalage;
341     fseek(in,0,SEEK_SET);
342     for (unsigned long j=0;j<nb+2;j++)
343     fwrite(&(hash[j]),sizeof(unsigned long),1,in);
344     }
345    
346     }
347 francois 283
348 francois 757 int FEM_SOLUTION::get_nb_gauss(int i)
349     {
350     if ((typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT1_GAUSS)||(typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2_GAUSS)||(typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3_GAUSS))
351     {
352     unsigned long nb=hash[0];
353     unsigned long pos=hash[i+1];
354     unsigned long pospro=hash[i+2];
355     int nbval=(pospro-pos)/nb_champs/dim_solution;
356     return nbval;
357     }
358     return 0;
359     }
360    
361    
362 francois 283 void FEM_SOLUTION::change_legende(int num,std::string val)
363     {
364     legende[num]=val;
365     }
366    
367     std::string FEM_SOLUTION::get_legende(int num)
368     {
369     return legende[num];
370     }
371    
372     int FEM_SOLUTION::get_nb_champ(void)
373     {
374     return nb_champs;
375     }
376    
377     FEM_MAILLAGE* FEM_SOLUTION::get_maillage(void)
378     {
379     return femmai;
380     }
381    
382 francois 375 double FEM_SOLUTION::get_legende_min(int num)
383 francois 283 {
384 francois 375 return solmin[num];
385 francois 283 }
386    
387 francois 375 double FEM_SOLUTION::get_legende_max(int num)
388 francois 283 {
389 francois 375 return solmax[num];
390 francois 283 }
391 francois 375 int FEM_SOLUTION::get_dim_solution(void)
392     {
393     return dim_solution;
394     }
395 francois 283 void FEM_SOLUTION::active_solution(int num)
396     {
397 francois 375 for (int j=0;j<9;j++)
398     {
399     solmax[j]=-1e308;
400     solmin[j]=1e308;
401     }
402 francois 283 int i=0;
403 francois 375 if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_NOEUD)
404 francois 283 {
405     LISTE_FEM_NOEUD::iterator it;
406     for (FEM_NOEUD* no=femmai->get_premier_noeud(it);no!=NULL;no=femmai->get_suivant_noeud(it))
407     {
408 francois 375 for (int k=0;k<dim_solution;k++)
409     {
410     double val=lire(i,num,k);
411     no->change_solution(val,k);
412     if (val<solmin[k]) solmin[k]=val;
413     if (val>solmax[k]) solmax[k]=val;
414     }
415 francois 283 i++;
416     }
417     }
418 francois 375 if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT1)
419 francois 283 {
420 francois 309 LISTE_FEM_ELEMENT1::iterator it;
421     for (FEM_ELEMENT1* seg=femmai->get_premier_element1(it);seg!=NULL;seg=femmai->get_suivant_element1(it))
422 francois 283 {
423 francois 375 for (int k=0;k<dim_solution;k++)
424     {
425     double val=lire(i,num,k);
426     seg->change_solution(val,k);
427     if (val<solmin[k]) solmin[k]=val;
428     if (val>solmax[k]) solmax[k]=val;
429     }
430 francois 283 i++;
431     }
432     }
433 francois 375 if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2)
434 francois 283 {
435 francois 309 LISTE_FEM_ELEMENT2::iterator it;
436     for (FEM_ELEMENT2* tri=femmai->get_premier_element2(it);tri!=NULL;tri=femmai->get_suivant_element2(it))
437 francois 283 {
438 francois 375 for (int k=0;k<dim_solution;k++)
439     {
440     double val=lire(i,num);
441     tri->change_solution(val);
442     if (val<solmin[k]) solmin[k]=val;
443     if (val>solmax[k]) solmax[k]=val;
444     }
445 francois 283 i++;
446     }
447     }
448 francois 375 if (typeentite==MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3)
449 francois 283 {
450 francois 309 LISTE_FEM_ELEMENT3::iterator it;
451     for (FEM_ELEMENT3* tet=femmai->get_premier_element3(it);tet!=NULL;tet=femmai->get_suivant_element3(it))
452 francois 283 {
453 francois 375 for (int k=0;k<dim_solution;k++)
454     {
455     double val=lire(i,num);
456     tet->change_solution(val);
457     if (val<solmin[k]) solmin[k]=val;
458     if (val>solmax[k]) solmax[k]=val;
459     }
460 francois 283 i++;
461     }
462     }
463 francois 375 for (int k=0;k<dim_solution;k++)
464     if (OPERATEUR::egal(fabs(solmin[k]-solmax[k]),0.,1e-10)==1)
465     solmax[k]=solmin[k]+1e-10;
466 francois 283 }
467    
468     std::string FEM_SOLUTION::get_nom(void)
469     {
470     return nomsolution;
471     }
472    
473 francois 326 std::string FEM_SOLUTION::get_nom_fichier(void)
474     {
475     return nom_fichier;
476     }
477 francois 283 void FEM_SOLUTION::enregistrer(std::ostream& o)
478     {
479 francois 375 o << "%" << get_id() << "=FEM_SOLUTION(" << typeentite << "," << dim_solution << "," << nomsolution << ",$" << femmai->get_id() << "," << nb_champs << "," << nom_fichier << ",(";
480 francois 283 for (int i=0;i<nb_champs;i++)
481     {
482     o << legende[i];
483     if (i!=nb_champs-1) o<<",";
484     else o<<")";
485     }
486    
487    
488     o << ");" << std::endl;
489     }
490    
491    
492    
493    
494     std::ostream& operator << (std::ostream& o,FEM_SOLUTION& sol)
495     {
496     sol.enregistrer(o);
497     return o;
498     }
499    
500