MAGiC  V5.0
Mailleurs Automatiques de Géometries intégrés à la Cao
mgaster.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 //####// mgaster.cpp
15 //####//
16 //####//------------------------------------------------------------
17 //####//------------------------------------------------------------
18 //####// COPYRIGHT 2000-2025
19 //####// Derniere modification par francois
20 //####// lun 03 fév 2025 15:29:46 EST
21 //####//------------------------------------------------------------
22 //####//------------------------------------------------------------
23 #include "gestionversion.h"
24 #include "mgaster.h"
25 #include "fem_maillage.h"
26 #include "mg_gestionnaire.h"
27 #include "mg_export.h"
28 #include "mg_import.h"
29 #include "mglanceuraster.h"
30 #include <sys/stat.h>
31 #include <fstream>
32 
33 
34 
35 
36 
37 
38 
39 
40 MGASTER::MGASTER():affichageactif(0)
41 {
42 ini_param();
43 
44 }
45 
46 MGASTER::MGASTER(MGASTER &mdd):affichageactif(mdd.affichageactif)
47 {
48 ini_param();
49 }
50 
51 
53 {
54 }
55 
56 void MGASTER::active_affichage(void (*fonc)(char*))
57 {
58 affiche=fonc;
60 }
61 
62 int MGASTER::calcule(char* nomfichierparam,FEM_MAILLAGE* fem,char *nometude,int typeetude,char *code,bool avecenreg)
63 {
64 bool recures=true;
65 if (affichageactif==1) affiche((char*)"");
66 if (affichageactif==1) affiche((char*)"*************************");
67 if (affichageactif==1) affiche((char*)" Calcul par code aster");
68 if (affichageactif==1) affiche((char*)"*************************");
69 if (affichageactif==1) affiche((char*)"");
70 if (affichageactif==1) affiche((char*)"");
71 if (affichageactif==1) affiche((char*)"");
72 MG_EXPORT exp;
73 if (nomfichierparam!=NULL) exp.lire_params_aster(nomfichierparam);
74 double version;
76 char message[500];
77 if ((typeetude == MAGIC::CALCUL_ASTER::ELASTIQUE)) sprintf(message," Calcul elastique sur la geometrie %lu",geo->get_id());
78 if ((typeetude == MAGIC::CALCUL_ASTER::RIGIDITE)) {sprintf(message," Calcul de la matrice de rigidite sur la geometrie %lu",geo->get_id());recures=false;}
79 if ((typeetude == MAGIC::CALCUL_ASTER::THERMIQUE)) sprintf(message," Calcul thermique sur la geometrie %lu",geo->get_id());
80 if ((typeetude == MAGIC::CALCUL_ASTER::ELASTIQUE_GROT_GDEF)) sprintf(message," Calcul elastique grand deplacement sur la geometrie %lu",geo->get_id());
81 if ((typeetude == MAGIC::CALCUL_ASTER::PLASTIQUE)) sprintf(message," Calcul plastique sur la geometrie %lu",geo->get_id());
82 if ((typeetude == MAGIC::CALCUL_ASTER::CONTRAINTE_PLANE)) sprintf(message," Calcul de contrainte plane sur la geometrie %lu",geo->get_id());
83 if ((typeetude == MAGIC::CALCUL_ASTER::DEFORMATION_PLANE)) sprintf(message," Calcul de deformation plane sur la geometrie %lu",geo->get_id());
84 if ((typeetude == MAGIC::CALCUL_ASTER::RIGIDITE_CONTRAINTE_PLANE)) {sprintf(message," Calcul de la matrice de rigidite en contrainte plane sur la geometrie %lu",geo->get_id());;recures=false;}
85 if ((typeetude == MAGIC::CALCUL_ASTER::RIGIDITE_DEFORMATION_PLANE)) {sprintf(message," Calcul de la matrice de rigidite en deformation plane sur la geometrie %lu",geo->get_id());;recures=false;}
86 if ((typeetude == MAGIC::CALCUL_ASTER::ELASTIQUE_NON_LINEAIRE_3D)) sprintf(message," Calcul elastique non lineaire sur la geometrie %lu",geo->get_id());
87 if (affichageactif==1) affiche(message);
88 char resultat[10];
89 strcpy(resultat,"00011111");
90 if ((typeetude == MAGIC::CALCUL_ASTER::THERMIQUE)) strcpy(resultat,"");
91 if (code!=NULL) strcpy(resultat,code);
92 version=exp.aster(geo,fem,nometude,typeetude,resultat);
93 int base=exp.get_base_aster();
94 
95 if (affichageactif==1)
96  {
97  char messagever[255];
98  sprintf(messagever," Calcul aster \033[1;32m%.1lf\033[1;33m ",version);
99  affiche(messagever);
100  }
101 char fichier_mess[500];
102 strcpy(fichier_mess,nometude);
103 strcat(fichier_mess,(char*)".mess");
104 char fichier_resu[500];
105 strcpy(fichier_resu,nometude);
106 strcat(fichier_resu,(char*)".resu");
107 bool fichier_mess_existant=false;
108 bool fichier_resu_existant=false;
109 bool fichier_resu_vide=false;
110 struct stat t_stat_mess;
111 struct stat t_stat_resu;
112 std::ifstream stream_fichier_mess;
113 stream_fichier_mess.open(fichier_mess, std::ifstream::in);
114 if(stream_fichier_mess.good())
115 {
116  fichier_mess_existant=true;
117  stat(fichier_mess,&t_stat_mess);
118  stream_fichier_mess.close();
119 }
120 else
121 {
122  t_stat_mess.st_ctime=0;
123 }
124 std::ifstream stream_fichier_resu;
125 stream_fichier_resu.open(fichier_resu, std::ifstream::in);
126 if(stream_fichier_resu.good())
127 {
128  fichier_resu_existant=true;
129  stat(fichier_mess,&t_stat_resu);
130  stream_fichier_resu.close();
131 }
132 else
133 {
134  t_stat_resu.st_ctime=0;
135 }
136 
137 
138 
139 MGLANCEURASTER aster;
140 int codesortie=aster.execute(param,nometude,version);
141 if(fichier_mess_existant)
142  {
143  struct stat t_stat_2;
144  stat(fichier_mess,&t_stat_2);
145  if(t_stat_2.st_ctime<=t_stat_mess.st_ctime)
146  fichier_mess_existant=false;
147  }
148 else
149  {
150  stream_fichier_mess.open(fichier_mess, std::ifstream::in);
151  if(stream_fichier_mess.good())
152  fichier_mess_existant=true;
153  else fichier_mess_existant=false;
154 
155  }
156 if(fichier_resu_existant)
157  {
158  struct stat t_stat_2;
159  stat(fichier_resu,&t_stat_2);
160  if(t_stat_2.st_ctime<=t_stat_resu.st_ctime)
161  fichier_resu_existant=false;
162  if (t_stat_2.st_size<2)
163  {
164  fichier_resu_existant=false;
165  fichier_resu_vide=true;
166  }
167  }
168 else
169  {
170  stream_fichier_resu.open(fichier_resu, std::ifstream::in);
171  if(stream_fichier_resu.good())
172  fichier_resu_existant=true;
173  else fichier_resu_existant=false;
174  struct stat t_stat_2;
175  stat(fichier_resu,&t_stat_2);
176  if (t_stat_2.st_size<2)
177  {
178  fichier_resu_existant=false;
179  fichier_resu_vide=true;
180  }
181  }
182 sprintf(message," Retour aster : erreur = \033[1;31m%s \033[1;33m\n fichier mess = \033[1;31m%s \033[1;33m\n fichier resu = \033[1;31m%s \033[1;33m",codesortie==0 ? "non" : "oui",fichier_mess_existant ? "oui" : "non",fichier_resu_existant ? "oui" : (fichier_resu_vide ? "vide" : "non"));
183 if (affichageactif==1) affiche(message);
184 if ((fichier_mess_existant) && (codesortie!=0))
185  {
186  FILE *out=fopen(fichier_mess, "rt");
187  int i=0;
188  while (!feof(out))
189  {
190  i++;
191  char chaine[256];
192  fgets(chaine,255,out);
193  char* ptr1=strstr(chaine,"Erreur");
194  char* ptr2=strstr(chaine,"erreur");
195  char* ptr3=strstr(chaine,"Error");
196  char* ptr4=strstr(chaine,"error");
197  if ((ptr1!=NULL)||(ptr2!=NULL)||(ptr3!=NULL)||(ptr4!=NULL))
198  {
199  sprintf(message," Ligne \033[1;31m%d\033[1;33m : \033[1;31m%s\033[1;33m",i,chaine);
200  for (int j=0;j<strlen(message);j++)
201  if (message[j]=='\n') message[j]=' ';
202  affiche(message);
203  }
204  }
205 
206  fclose(out);
207  }
208 
209 
210 if (recures)
211  {
212  if (affichageactif==1) affiche((char*)" Recuperation des resultats");
213  char nomfichiertmp[600];
214  MG_IMPORT imp;
215  sprintf(nomfichiertmp,"%s.resu",nometude);
216  std::string res=imp.aster(base,fem,nomfichiertmp,nometude);
217  if (affichageactif==1) printf("%s",(char*)("\033[1;31m"+res+"\033[1;33m").c_str());
218  if (avecenreg==true)
219  {
220  if (affichageactif==1) affiche((char*)" Enregistrement MAGIC");
221  sprintf(nomfichiertmp,"%s.magic",nometude);
222  fem->get_mg_maillage()->get_gestionnaire()->enregistrer(nomfichiertmp);
223  if (affichageactif==1) affiche((char*)" Enregistrement GMSH");
224  exp.gmsh(fem,nometude);
225  }
226  }
227 return codesortie;
228 }
229 int MGASTER::calcule_fatigue(char* nomfichierparam,FEM_MAILLAGE* fem,char *nometude,int typeetude,std::vector<FEM_ELEMENT3*> *lst,int niveaumax,char *code,bool avecenreg)
230 {
231 bool recures=true;
232 if (affichageactif==1) affiche((char*)"");
233 if (affichageactif==1) affiche((char*)"*************************");
234 if (affichageactif==1) affiche((char*)" Calcul par code aster");
235 if (affichageactif==1) affiche((char*)"*************************");
236 if (affichageactif==1) affiche((char*)"");
237 if (affichageactif==1) affiche((char*)"");
238 if (affichageactif==1) affiche((char*)"");
239 MG_EXPORT exp;
240 if (nomfichierparam!=NULL) exp.lire_params_aster(nomfichierparam);
241 double version;
243 char message[500];
244 if ((typeetude == MAGIC::CALCUL_ASTER::ELASTIQUE_NON_LINEAIRE_3D_FATIGUE)) sprintf(message," Calcul de fatigue sur la geometrie %lu",geo->get_id());
245 if (affichageactif==1) affiche(message);
246 char resultat[10];
247 strcpy(resultat,"00011111");
248 if (code!=NULL) strcpy(resultat,code);
249 version=exp.aster(geo,fem,nometude,typeetude,resultat,0.,niveaumax,lst);
250 int base=exp.get_base_aster();
251 
252 if (affichageactif==1)
253  {
254  char messagever[255];
255  sprintf(messagever," Calcul aster \033[1;32m%.1lf\033[1;33m ",version);
256  affiche(messagever);
257  }
258 
259 MGLANCEURASTER aster;
260 int codesortie=aster.execute(param,nometude,version);
261 if (codesortie!=0)
262  {
263  sprintf(message," Code de sortie aster : %d",codesortie);
264  if (affichageactif==1) affiche(message);
265  return codesortie;
266  }
267 if (recures)
268  {
269  if (affichageactif==1) affiche((char*)" Recuperation des resultats");
270  char nomfichiertmp[600];
271  MG_IMPORT imp;
272  sprintf(nomfichiertmp,"%s.resu",nometude);
273  std::string res=imp.aster(base,fem,nomfichiertmp,nometude);
274  if (affichageactif==1) printf("%s",(char*)("\033[1;31m"+res+"\033[1;33m").c_str());
275  if (avecenreg==true)
276  {
277  if (affichageactif==1) affiche((char*)" Enregistrement MAGIC");
278  sprintf(nomfichiertmp,"%s.magic",nometude);
279  fem->get_mg_maillage()->get_gestionnaire()->enregistrer(nomfichiertmp);
280  if (affichageactif==1) affiche((char*)" Enregistrement GMSH");
281  exp.gmsh(fem,nometude);
282  }
283  }
284 return 0;
285 
286 }
287 
288 
289 
291 {
292 param.ajouter("Affiche_Code_Aster",0,OT_PARAMETRES::DOUBLE,"0. Affichage redirigé vers le fichier aster.log 1 affichage dans un terminal");
293 char fichier[500];
294 param.ajouter("Container_singularity_aster","~/containers/salome_meca-lgpl-2022.1.0-1-20221225-scibian-9.sif",OT_PARAMETRES::STRING,"Proprietes aster : Fichier du container code-aster (version >15)");
295 sprintf(fichier,"%s/.magic",getenv("HOME"));
296 param.lire(fichier);
297 param.enregistrer(fichier);
298 
299 }
300 
MG_EXPORT
Definition: mg_export.h:33
MG_GESTIONNAIRE::enregistrer
virtual void enregistrer(std::ostream &o, double version=MAGIC_VERSION_FICHIER_DOUBLE)
Definition: mg_gestionnaire.cpp:1070
MGASTER::calcule
virtual int calcule(char *nomfichierparam, class FEM_MAILLAGE *fem, char *nometude, int typeetude, char *code=NULL, bool avecenreg=true)
Definition: mgaster.cpp:62
MGASTER::MGASTER
MGASTER()
Definition: mgaster.cpp:40
MG_IMPORT
Definition: mg_import.h:31
gestionversion.h
MGASTER::affiche
void(* affiche)(char *mess)
Definition: mgaster.h:40
mg_gestionnaire.h
MAGIC::CALCUL_ASTER::DEFORMATION_PLANE
@ DEFORMATION_PLANE
Definition: mg_definition.h:139
MG_IDENTIFICATEUR::get_id
unsigned long get_id()
Definition: mg_identificateur.cpp:53
MAGIC::CALCUL_ASTER::THERMIQUE
@ THERMIQUE
Definition: mg_definition.h:137
MAGIC::CALCUL_ASTER::ELASTIQUE_NON_LINEAIRE_3D
@ ELASTIQUE_NON_LINEAIRE_3D
Definition: mg_definition.h:160
MGASTER::affichageactif
int affichageactif
Definition: mgaster.h:42
fem_maillage.h
MAGIC::CALCUL_ASTER::RIGIDITE_DEFORMATION_PLANE
@ RIGIDITE_DEFORMATION_PLANE
Definition: mg_definition.h:142
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
MGASTER::~MGASTER
virtual ~MGASTER()
Definition: mgaster.cpp:52
MAGIC::CALCUL_ASTER::RIGIDITE_CONTRAINTE_PLANE
@ RIGIDITE_CONTRAINTE_PLANE
Definition: mg_definition.h:141
MAGIC::CALCUL_ASTER::PLASTIQUE
@ PLASTIQUE
Definition: mg_definition.h:135
mglanceuraster.h
FEM_MAILLAGE::get_mg_maillage
MG_MAILLAGE * get_mg_maillage(void)
Definition: fem_maillage.cpp:93
MGASTER::calcule_fatigue
virtual int calcule_fatigue(char *nomfichierparam, class FEM_MAILLAGE *fem, char *nometude, int typeetude, std::vector< class FEM_ELEMENT3 * > *lst, int niveaumax, char *code=NULL, bool avecenreg=true)
Definition: mgaster.cpp:229
MGASTER
Definition: mgaster.h:29
mgaster.h
MGLANCEURASTER
Definition: mglanceuraster.h:28
MG_IMPORT::aster
std::string aster(int base, class FEM_MAILLAGE *mai, char *chaine, char *nomfichier)
Definition: mg_import.cpp:395
mg_export.h
FEM_MAILLAGE
Definition: fem_maillage.h:66
OT_PARAMETRES::DOUBLE
@ DOUBLE
Definition: ot_parametres.h:38
MG_EXPORT::gmsh
void gmsh(class MG_MAILLAGE *mai, std::string fichier)
Definition: mg_export.cpp:803
MG_EXPORT::aster
double aster(class MG_GEOMETRIE *geo, class FEM_MAILLAGE *mai, std::string fichier, int typeetude, char *coderesu, double penal=0., int niveaumax=0, std::vector< class FEM_ELEMENT3 * > *lst=NULL)
mg_import.h
OT_PARAMETRES::enregistrer
void enregistrer(char *nom)
Definition: ot_parametres.cpp:132
MAGIC::CALCUL_ASTER::ELASTIQUE_NON_LINEAIRE_3D_FATIGUE
@ ELASTIQUE_NON_LINEAIRE_3D_FATIGUE
Definition: mg_definition.h:161
MAGIC::CALCUL_ASTER::ELASTIQUE
@ ELASTIQUE
Definition: mg_definition.h:134
MG_MAILLAGE::get_gestionnaire
MG_GESTIONNAIRE * get_gestionnaire(void)
Definition: mg_maillage.cpp:2658
MAGIC::CALCUL_ASTER::CONTRAINTE_PLANE
@ CONTRAINTE_PLANE
Definition: mg_definition.h:138
MG_MAILLAGE::get_mg_geometrie
MG_GEOMETRIE * get_mg_geometrie(void)
Definition: mg_maillage.cpp:410
MG_EXPORT::lire_params_aster
void lire_params_aster(char *fichier)
Definition: mg_export.cpp:100
MAGIC::CALCUL_ASTER::ELASTIQUE_GROT_GDEF
@ ELASTIQUE_GROT_GDEF
Definition: mg_definition.h:147
MGASTER::active_affichage
virtual void active_affichage(void(*fonc)(char *))
Definition: mgaster.cpp:56
MG_GEOMETRIE
Definition: mg_geometrie.h:84
OT_PARAMETRES::lire
int lire(char *nom)
Definition: ot_parametres.cpp:144
res
#define res(i, j)
MGLANCEURASTER::execute
virtual int execute(OT_PARAMETRES &param, char *nometude, double version)
Definition: mglanceuraster.cpp:41
MGASTER::ini_param
void ini_param(void)
Definition: mgaster.cpp:290
MAGIC::CALCUL_ASTER::RIGIDITE
@ RIGIDITE
Definition: mg_definition.h:140
MGASTER::param
OT_PARAMETRES param
Definition: mgaster.h:43
MG_EXPORT::get_base_aster
int get_base_aster(void)
Definition: mg_export.cpp:121