ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/fem_solution.cpp
Revision: 174
Committed: Wed Apr 22 21:46:09 2009 UTC (16 years ago) by francois
Original Path: magic/lib/geometrie/geometrie/src/fem_solution.cpp
File size: 5559 byte(s)
Log Message:
Plusieurs modif importantes : 
1) la fonction un point appartient a une face est generique donc le mailleurbloc et le remailleur utilise la methode generic
2) dans une boucle il y une methode qui permet de connaitre la coarete suivante et precedente
3) Des solutions sont possibles aux elements. Attention le format de fichier magic est change pour SOLUTION. Il y a un parametre different. Si il y a des solutions dans le fichier il n y a pas compatibilite avec le format d'avant

File Contents

# User Rev Content
1 5 //------------------------------------------------------------
2     //------------------------------------------------------------
3     // MAGiC
4 francois 174 // Jean Christophe Cuilli�re et Vincent FRANCOIS
5     // D�partement de G�nie M�canique - UQTR
6 5 //------------------------------------------------------------
7 francois 174 // 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 5 // des auteurs (contact : francois@uqtr.ca)
12     //------------------------------------------------------------
13     //------------------------------------------------------------
14     //
15     // fem_solution.cpp
16     //
17     //------------------------------------------------------------
18     //------------------------------------------------------------
19     // COPYRIGHT 2000
20 francois 174 // Version du 02/03/2006 � 11H22
21 5 //------------------------------------------------------------
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 174 FEM_SOLUTION::FEM_SOLUTION(FEM_MAILLAGE* mai,int nb,char* chemin,int code,std::string nomsol,int entite):MG_IDENTIFICATEUR(),nb_champs(nb),femmai(mai),nomsolution(nomsol),typeentite(entite)
44 5 {
45     nom_fichier=new char[strlen(chemin)+2];
46     legende=new std::string[nb];
47     for (int i=0;i<nb;i++)
48     {
49     char mess[15];
50     sprintf(mess,"Champs_%d",i);
51     legende[i]=mess ;
52     }
53     strcpy(nom_fichier,chemin);
54     if (code!=0)
55     {
56     in=fopen(nom_fichier,"wb");
57     for (int i=0;i<code;i++)
58     for (int j=0;j<nb;j++)
59     {
60     double val=0.0;
61     fwrite(&val,sizeof(double),1,in);
62     }
63     fclose(in);
64     }
65     in=fopen(nom_fichier,"r+b");
66     }
67    
68 francois 174 FEM_SOLUTION::FEM_SOLUTION(unsigned long num,FEM_MAILLAGE* mai,int nb,char* chemin,int code,std::string nomsol,int entite):MG_IDENTIFICATEUR(num),nb_champs(nb),femmai(mai),nomsolution(nomsol),typeentite(entite)
69 5 {
70     nom_fichier=new char[strlen(chemin)+2];
71     legende=new std::string[nb];
72     for (int i=0;i<nb;i++)
73     {
74     char mess[15];
75     sprintf(mess,"Champs_%d",i);
76     legende[i]=mess ;
77     }
78     strcpy(nom_fichier,chemin);
79     if (code!=0)
80     {
81     in=fopen(nom_fichier,"wb");
82     for (int i=0;i<code;i++)
83     for (int j=0;j<nb;j++)
84     {
85     double val=0.0;
86     fwrite(&val,sizeof(double),1,in);
87     }
88     fclose(in);
89     }
90     in=fopen(nom_fichier,"r+b");
91     }
92    
93     FEM_SOLUTION::~FEM_SOLUTION()
94     {
95     delete [] nom_fichier;
96     delete [] legende;
97     if (in!=NULL) fclose(in);
98     }
99    
100     void FEM_SOLUTION::efface(void)
101     {
102     fclose(in);
103     remove(nom_fichier);
104     // DeleteFile(nom_fichier);
105     in=NULL;
106     }
107    
108 francois 174 int FEM_SOLUTION::get_type_solution(void)
109     {
110     return typeentite;
111     }
112    
113 5 double FEM_SOLUTION::lire(int i,int j)
114     {
115     long pos=(nb_champs*i+j)*sizeof(double);
116     fseek(in,pos,SEEK_SET);
117     double val;
118     fread(&val,sizeof(double),1,in);
119     return (val);
120     }
121    
122     void FEM_SOLUTION::ecrire(int i,int j,double val)
123     {
124     long pos=(nb_champs*i+j)*sizeof(double);
125     fseek(in,pos,SEEK_SET);
126     fwrite(&val,sizeof(double),1,in);
127     fflush(in);
128     }
129    
130    
131     void FEM_SOLUTION::change_legende(int num,std::string val)
132     {
133     legende[num]=val;
134     }
135    
136     std::string FEM_SOLUTION::get_legende(int num)
137     {
138     return legende[num];
139     }
140    
141     int FEM_SOLUTION::get_nb_champ(void)
142     {
143     return nb_champs;
144     }
145    
146     FEM_MAILLAGE* FEM_SOLUTION::get_maillage(void)
147     {
148     return femmai;
149     }
150    
151     double FEM_SOLUTION::get_legende_min(void)
152     {
153     return solmin;
154     }
155    
156     double FEM_SOLUTION::get_legende_max(void)
157     {
158     return solmax;
159     }
160    
161     void FEM_SOLUTION::active_solution(int num)
162     {
163 francois 174 int nb;
164     if (typeentite==ENTITE_NOEUD) nb=femmai->get_nb_fem_noeud();
165     if (typeentite==ENTITE_SEGMENT) nb=femmai->get_nb_fem_segment();
166     if (typeentite==ENTITE_TRIANGLE) nb=femmai->get_nb_fem_triangle();
167     if (typeentite==ENTITE_TETRA) nb=femmai->get_nb_fem_tetra();
168     for (int i=0;i<nb;i++)
169 5 {
170 francois 174 FEM_ELEMENT_MAILLAGE* ele;
171     if (typeentite==ENTITE_NOEUD) ele=femmai->get_fem_noeud(i);
172     if (typeentite==ENTITE_SEGMENT) ele=femmai->get_fem_segment(i);
173     if (typeentite==ENTITE_TRIANGLE) ele=femmai->get_fem_triangle(i);
174     if (typeentite==ENTITE_TETRA) ele=femmai->get_fem_tetra(i);
175     double val=lire(i,num);
176     ele->change_solution(val);
177 5 if (i==0)
178     {
179     solmin=val;
180     solmax=val;
181     }
182     if (val<solmin) solmin=val;
183     if (val>solmax) solmax=val;
184     }
185     if (OPERATEUR::egal(fabs(solmin-solmax),0.,1e-10)==1)
186     solmax=solmin+1e-10;
187     }
188    
189     std::string FEM_SOLUTION::get_nom(void)
190     {
191     return nomsolution;
192     }
193    
194     void FEM_SOLUTION::enregistrer(std::ostream& o)
195     {
196 francois 174 o << "%" << get_id() << "=FEM_SOLUTION(" << typeentite << "," << nomsolution << ",$" << femmai->get_id() << "," << nb_champs << "," << nom_fichier << ",(";
197 5 for (int i=0;i<nb_champs;i++)
198     {
199     o << legende[i];
200     if (i!=nb_champs-1) o<<","; else o<<")";
201     }
202    
203    
204     o << ");" << std::endl;
205     }
206    
207    
208    
209    
210     std::ostream& operator << (std::ostream& o,FEM_SOLUTION& sol)
211     {
212     sol.enregistrer(o);
213     return o;
214     }
215    
216