ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/aster/src/mgaster.cpp
Revision: 1189
Committed: Tue Feb 4 17:26:49 2025 UTC (3 months ago) by francois
File size: 10875 byte(s)
Log Message:
Version 5.0 de MAGIC. Integration de ALGLIB pour faire de l'optimisation. ALGLIB se download automatiquement en executant un script dans le repertoire config update_magic.bash


File Contents

# Content
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
52 MGASTER::~MGASTER()
53 {
54 }
55
56 void MGASTER::active_affichage(void (*fonc)(char*))
57 {
58 affiche=fonc;
59 affichageactif=1;
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;
75 MG_GEOMETRIE* geo=fem->get_mg_maillage()->get_mg_geometrie();
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;
242 MG_GEOMETRIE* geo=fem->get_mg_maillage()->get_mg_geometrie();
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
290 void MGASTER::ini_param(void)
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