MAGiC  V5.0
Mailleurs Automatiques de Géometries intégrés à la Cao
mg_calcule_proprietes.cpp
Aller à la documentation de ce fichier.
1 //####//------------------------------------------------------------
2 //####//------------------------------------------------------------
3 //####// MAGiC
4 //####// Jean Christophe Cuilliere et Vincent FRANCOIS
5 //####// Departement de Genie Mecanique - UQTR
6 //####//------------------------------------------------------------
7 //####// MAGIC est un projet de recherche de l equipe ERICCA
8 //####// du departement de genie mecanique de l Universite du Quebec a Trois Rivieres
9 //####// http://www.uqtr.ca/ericca
10 //####// http://www.uqtr.ca/
11 //####//------------------------------------------------------------
12 //####//------------------------------------------------------------
13 //####//
14 //####// mg_calcule_proprietes.cpp
15 //####//
16 //####//------------------------------------------------------------
17 //####//------------------------------------------------------------
18 //####// COPYRIGHT 2000-2024
19 //####// jeu 13 jun 2024 11:58:57 EDT
20 //####//------------------------------------------------------------
21 //####//------------------------------------------------------------
22 #include "gestionversion.h"
23 #include "mg_calcule_proprietes.h"
24 #include "mg_file.h"
25 #include "ot_parametres.h"
27 #include <math.h>
28 
30 {
31 }
32 
34 {
35 }
36 
38 {
39 }
40 
41 void MG_CALCULE_PROPRIETES::active_affichage(void (*fonc)(char*))
42 {
43 affiche=fonc;
45 }
46 
48 {
49 OT_PARAMETRES param;
50 param.ajouter("Separateur_decimale",",",OT_PARAMETRES::STRING,"Seprateur décimale pour l'exportation des fichiers excel");
51 char fichier[500];
52 sprintf(fichier,"%s/.magic",getenv("HOME"));
53 param.lire(fichier);
54 param.enregistrer(fichier);
55 char c=(param.get_nom("Separateur_decimale").c_str())[0];
56 return c;
57 }
58 
59 int MG_CALCULE_PROPRIETES::calcul_masse_humidite(char *fichiersol,char *Resultat,MG_GESTIONNAIRE &gest,double &resu,double tf,int pas,double m0,int Pasvariable,int division_pas,MG_GEOMETRIE *geo)
60 {
61 FEM_MAILLAGE* fem;
62 FEM_SOLUTION* sol;
63 char c=get_seprateur_decimale();
64 recupere_maillage(gest,&fem);
65 char nom1[500];
66 char nom2[500];
67 sprintf(nom1,"%s.csv",Resultat);
68 sprintf(nom2,"%s.txt",Resultat);
69 FILE* file_resu1=fopen(nom1,"wt");
70 FILE* file_resu2=fopen(nom2,"wt");
71 fprintf (file_resu1, "%s ; %s ; %s ; %s ; %s ; %s ; %s\n","Pas","Nombre de jours","Racine carrée du jour","Prise de masse en Kg","Prise de masse en g","masse echantillon","Prise de masse en pourcentage");
72 fprintf (file_resu2, "%s %s %s %s %s %s %s\n","Pas","Nombre_de_jours","Racine_carrée_ du_jour","Prise_de_masse_en_Kg","Prise_de_masse_en_g","masse_echantillon","Prise_de_masse_en_pourcentage");
73 int l=1;
74 for(int k=0;k<(pas+1);k++)
75 {
76 recupere_concentration(fichiersol,gest,fem,&sol,k);
77 sol->active_solution(0);
78 
79 double masse=0.;
80 double jac[9];
81 double unite=fem->get_mg_geometrie()->get_valeur_unite();
82 LISTE_FEM_ELEMENT3::iterator it;
83 for (FEM_ELEMENT3* ele=fem->get_premier_element3(it);ele!=NULL;ele=fem->get_suivant_element3(it))
84  {
85  double w;
86  double uvw[3];
87  double degmax=ele->get_degremax_fonction_interpolation();
88  int nbfonc=ele->get_nb_fonction_interpolation();
89  int nbgauss=ele->get_nb_pt_gauss(degmax);
90  double M;
91  M=0;
92  for(int i=0;i<nbgauss;i++)
93  {
94  ele->get_pt_gauss(degmax,i,w,uvw);
95  double uvw1[3]={uvw[0],uvw[1],uvw[2]};
96  //Determinant du Jacobien//
97  double detJ=ele->get_jacobien(jac,uvw1,1.);
98  //Les fonction d'interpolation//
99 
100  // Concentrations aux noeuds//
101  if (nbfonc==4)
102  {
103  double N1=ele->get_fonction_interpolation(1,uvw1);
104  double N2=ele->get_fonction_interpolation(2,uvw1);
105  double N3=ele->get_fonction_interpolation(3,uvw1);
106  double N4=ele->get_fonction_interpolation(4,uvw1);
107  double C1= (ele->get_fem_noeud(0)->get_solution())*(pow(unite,3));
108  double C2= (ele->get_fem_noeud(1)->get_solution())*(pow(unite,3));
109  double C3= (ele->get_fem_noeud(2)->get_solution())*(pow(unite,3));
110  double C4= (ele->get_fem_noeud(3)->get_solution())*(pow(unite,3));
111  double F=(N1*C1+N2*C2+N3*C3+N4*C4)*fabs(detJ);
112  M=M+(w*F);
113  }
114  if (nbfonc==8)
115  {
116  double N1=ele->get_fonction_interpolation(1,uvw1);
117  double N2=ele->get_fonction_interpolation(2,uvw1);
118  double N3=ele->get_fonction_interpolation(3,uvw1);
119  double N4=ele->get_fonction_interpolation(4,uvw1);
120  double N5=ele->get_fonction_interpolation(5,uvw1);
121  double N6=ele->get_fonction_interpolation(6,uvw1);
122  double N7=ele->get_fonction_interpolation(7,uvw1);
123  double N8=ele->get_fonction_interpolation(8,uvw1);
124  double C1= (ele->get_fem_noeud(0)->get_solution())*(pow(unite,3));
125  double C2= (ele->get_fem_noeud(1)->get_solution())*(pow(unite,3));
126  double C3= (ele->get_fem_noeud(2)->get_solution())*(pow(unite,3));
127  double C4= (ele->get_fem_noeud(3)->get_solution())*(pow(unite,3));
128  double C5=(ele->get_fem_noeud(4)->get_solution())*(pow(unite,3));
129  double C6= (ele->get_fem_noeud(5)->get_solution())*(pow(unite,3));
130  double C7= (ele->get_fem_noeud(6)->get_solution())*(pow(unite,3));
131  double C8= (ele->get_fem_noeud(7)->get_solution())*(pow(unite,3));
132  double F=(N1*C1+N2*C2+N3*C3+N4*C4+N5*C5+N6*C6+N7*C7+N8*C8)*fabs(detJ);
133  M=M+(w*F);
134  }
135 
136 
137  }
138  masse=masse+M;
139 
140  }
141 resu=8*masse;
142 double jours;
143 if (Pasvariable==1)
144 {
145  MG_GEOM_FONCTION *fonc;
146  int val_Cond1;
147  int val_Cond2 = geo->get_nb_mg_arete();
148  int val_Cond3 = geo->get_nb_mg_sommet();
149  int val_Cond4 = geo->get_nb_mg_face();
150  int val_Cond5 = geo->get_nb_mg_geom_fonction();
151  if (val_Cond5==1) val_Cond1=3+val_Cond2+val_Cond3+val_Cond4; //fonctionne avec la géométrie virtuelle
152  if (val_Cond5==2) val_Cond1=4+val_Cond2+val_Cond3+val_Cond4; //fonctionne avec la géométrie virtuelle
153 
154  fonc = geo->get_mg_geom_fonctionid((int)val_Cond1);
155  double col[2];
156  double col1[2];
157  double diff;
158  int s;
159  fonc->get_point(0,col);
160  jours=col[1]/(86400);
161  if(k%division_pas!=0 && k!=0)
162  {
163  s=(division_pas*l)-k;
164  fonc->get_point(l,col);
165  fonc->get_point(l-1,col1);
166  diff=(col[1]-col1[1])/(86400*division_pas);
167  jours=(col[1]/86400)-s*diff;
168  }
169  if(k%division_pas==0 && k!=0)
170  {
171  fonc->get_point(l,col);
172  jours=col[1]/(86400);
173  l=l+1;
174  }
175 }
176 else
177 {
178 jours=((tf/pas)*k)/86400;
179 }
180 double prise_pourcentage=((resu*(1/unite))/m0)*100;
181 char chaine[5000];
182 if (k>=division_pas)
183 {
184 sprintf (chaine, "%d ; %lf ; %lf ; %lf ; %lf ; %lf ; %lf",k,jours,sqrt(jours),resu,resu*(1/unite),m0+resu*(1/unite),prise_pourcentage);
185 for (int i=0;i<strlen(chaine);i++)
186  if (chaine[i]=='.') chaine[i]=c;
187 fprintf(file_resu1,"%s\n",chaine);
188 sprintf (chaine, "%d %lf %lf %lf %lf %lf %lf",k,jours,sqrt(jours),resu,resu*(1/unite),m0+resu*(1/unite),prise_pourcentage);
189 fprintf(file_resu2,"%s\n",chaine);
190 }
191 }
192 fclose(file_resu2);
193 fclose(file_resu1);
194 return 0;
195 }
197 {
198 FEM_MAILLAGE *fem=gest.get_fem_maillage(0);
199 *femmesh=fem;
200 return 0;
201 }
202 
204 {
205 FEM_SOLUTION *sol=gest.get_fem_solution(k);
206 *solmesh=sol;
207 return 0;
208 }
209 
210 
MG_GEOM_FONCTION::get_point
virtual void get_point(int num, double *coo)
Definition: mg_geom_fonction.cpp:95
MG_CALCULE_PROPRIETES::recupere_concentration
int recupere_concentration(char *fichiersol, MG_GESTIONNAIRE &gest, FEM_MAILLAGE *fem, class FEM_SOLUTION **solmesh, int k)
Definition: mg_calcule_proprietes.cpp:203
FEM_SOLUTION
Definition: fem_solution.h:40
FEM_MAILLAGE::get_suivant_element3
FEM_ELEMENT3 * get_suivant_element3(LISTE_FEM_ELEMENT3::iterator &it)
Definition: fem_maillage.cpp:680
gestionversion.h
fct_generateur_calibrage.h
MG_CALCULE_PROPRIETES::MG_CALCULE_PROPRIETES
MG_CALCULE_PROPRIETES()
Definition: mg_calcule_proprietes.cpp:29
MG_GEOMETRIE::get_nb_mg_arete
unsigned int get_nb_mg_arete(void)
Definition: mg_geometrie.cpp:813
OT_PARAMETRES::STRING
@ STRING
Definition: ot_parametres.h:38
OT_PARAMETRES::ajouter
void ajouter(std::string chaine, double valeur, int typep, std::string aide="")
Definition: ot_parametres.cpp:61
mg_file.h
MG_CALCULE_PROPRIETES::affiche
void(* affiche)(char *mess)
Definition: mg_calcule_proprietes.h:47
FEM_ELEMENT3
Definition: fem_element3.h:34
FEM_MAILLAGE::get_mg_geometrie
MG_GEOMETRIE * get_mg_geometrie(void)
Definition: fem_maillage.cpp:88
MG_GESTIONNAIRE
Definition: mg_gestionnaire.h:57
MG_GESTIONNAIRE::get_fem_solution
FEM_SOLUTION * get_fem_solution(unsigned int num)
Definition: mg_gestionnaire.cpp:930
MG_CALCULE_PROPRIETES::calcul_masse_humidite
virtual int calcul_masse_humidite(char *fichiersol, char *Resultat, class MG_GESTIONNAIRE &gest, double &resu, double tf, int pas, double m0, int Pasvariable, int division_pas, class MG_GEOMETRIE *geo)
Definition: mg_calcule_proprietes.cpp:59
FEM_SOLUTION::active_solution
void active_solution(int num)
Definition: fem_solution.cpp:490
OT_PARAMETRES::get_nom
std::string get_nom(std::string chaine)
Definition: ot_parametres.cpp:266
FEM_MAILLAGE
Definition: fem_maillage.h:66
ot_parametres.h
MG_CALCULE_PROPRIETES::active_affichage
virtual void active_affichage(void(*fonc)(char *))
Definition: mg_calcule_proprietes.cpp:41
MG_CALCULE_PROPRIETES::recupere_maillage
int recupere_maillage(class MG_GESTIONNAIRE &gest, class FEM_MAILLAGE **femmesh)
Definition: mg_calcule_proprietes.cpp:196
mg_calcule_proprietes.h
MG_GEOM_FONCTION
Definition: mg_geom_fonction.h:29
MG_GESTIONNAIRE::get_fem_maillage
FEM_MAILLAGE * get_fem_maillage(unsigned int num)
Definition: mg_gestionnaire.cpp:670
MG_GEOMETRIE::get_mg_geom_fonctionid
MG_GEOM_FONCTION * get_mg_geom_fonctionid(unsigned long num)
Definition: mg_geometrie.cpp:2157
MG_GEOMETRIE::get_nb_mg_geom_fonction
unsigned int get_nb_mg_geom_fonction(void)
Definition: mg_geometrie.cpp:2198
MG_CALCULE_PROPRIETES::affichageactif
int affichageactif
Definition: mg_calcule_proprietes.h:48
OT_PARAMETRES
Definition: ot_parametres.h:31
MG_CALCULE_PROPRIETES::~MG_CALCULE_PROPRIETES
virtual ~MG_CALCULE_PROPRIETES()
Definition: mg_calcule_proprietes.cpp:37
MG_GEOMETRIE::get_nb_mg_face
unsigned int get_nb_mg_face(void)
Definition: mg_geometrie.cpp:1264
OT_PARAMETRES::enregistrer
void enregistrer(char *nom)
Definition: ot_parametres.cpp:132
sqrt
double2 sqrt(double2 &val)
Definition: ot_doubleprecision.cpp:345
MG_GEOMETRIE::get_valeur_unite
double get_valeur_unite(void)
Definition: mg_geometrie.cpp:2652
MG_GEOMETRIE
Definition: mg_geometrie.h:84
OT_PARAMETRES::lire
int lire(char *nom)
Definition: ot_parametres.cpp:144
MG_CALCULE_PROPRIETES::get_seprateur_decimale
char get_seprateur_decimale(void)
Definition: mg_calcule_proprietes.cpp:47
FEM_MAILLAGE::get_premier_element3
FEM_ELEMENT3 * get_premier_element3(LISTE_FEM_ELEMENT3::iterator &it)
Definition: fem_maillage.cpp:672
MG_GEOMETRIE::get_nb_mg_sommet
unsigned int get_nb_mg_sommet(void)
Definition: mg_geometrie.cpp:552
MG_CALCULE_PROPRIETES
Definition: mg_calcule_proprietes.h:31