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

# User Rev Content
1 francois 1158 //####//------------------------------------------------------------
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 francois 1189 //####// COPYRIGHT 2000-2025
19     //####// Derniere modification par francois
20     //####// lun 03 fév 2025 15:29:46 EST
21 francois 1158 //####//------------------------------------------------------------
22     //####//------------------------------------------------------------
23 francois 326 #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 francois 773 #include "mglanceuraster.h"
30 couturad 919 #include <sys/stat.h>
31     #include <fstream>
32 francois 326
33    
34    
35    
36    
37    
38    
39    
40 francois 470 MGASTER::MGASTER():affichageactif(0)
41 francois 326 {
42 francois 725 ini_param();
43 francois 326
44     }
45    
46 francois 470 MGASTER::MGASTER(MGASTER &mdd):affichageactif(mdd.affichageactif)
47 francois 326 {
48 francois 725 ini_param();
49 francois 326 }
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 francois 706 int MGASTER::calcule(char* nomfichierparam,FEM_MAILLAGE* fem,char *nometude,int typeetude,char *code,bool avecenreg)
63 francois 326 {
64 francois 786 bool recures=true;
65 gervaislavoie 382 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 francois 326 MG_EXPORT exp;
73 francois 706 if (nomfichierparam!=NULL) exp.lire_params_aster(nomfichierparam);
74 francois 581 double version;
75 francois 748 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 francois 786 if ((typeetude == MAGIC::CALCUL_ASTER::RIGIDITE)) {sprintf(message," Calcul de la matrice de rigidite sur la geometrie %lu",geo->get_id());recures=false;}
79 francois 748 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 francois 786 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 mejri 888 if ((typeetude == MAGIC::CALCUL_ASTER::ELASTIQUE_NON_LINEAIRE_3D)) sprintf(message," Calcul elastique non lineaire sur la geometrie %lu",geo->get_id());
87 francois 748 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 francois 757 int base=exp.get_base_aster();
94 francois 748
95 francois 581 if (affichageactif==1)
96     {
97     char messagever[255];
98 francois 691 sprintf(messagever," Calcul aster \033[1;32m%.1lf\033[1;33m ",version);
99 francois 581 affiche(messagever);
100     }
101 couturad 919 char fichier_mess[500];
102     strcpy(fichier_mess,nometude);
103     strcat(fichier_mess,(char*)".mess");
104 francois 1189 char fichier_resu[500];
105     strcpy(fichier_resu,nometude);
106     strcat(fichier_resu,(char*)".resu");
107 couturad 919 bool fichier_mess_existant=false;
108 francois 1189 bool fichier_resu_existant=false;
109     bool fichier_resu_vide=false;
110     struct stat t_stat_mess;
111     struct stat t_stat_resu;
112 couturad 919 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 francois 1189 stat(fichier_mess,&t_stat_mess);
118     stream_fichier_mess.close();
119 couturad 919 }
120     else
121     {
122 francois 1189 t_stat_mess.st_ctime=0;
123 couturad 919 }
124 francois 1189 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 francois 773 MGLANCEURASTER aster;
140 francois 963 int codesortie=aster.execute(param,nometude,version);
141 francois 1189 if(fichier_mess_existant)
142 couturad 919 {
143 francois 1189 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 couturad 919 {
190 francois 1189 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 couturad 919 }
205 francois 1008
206 francois 1189 fclose(out);
207     }
208 francois 1008
209    
210 francois 786 if (recures)
211 gervaislavoie 382 {
212 francois 786 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 gervaislavoie 382 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 francois 786 }
227 francois 1008 return codesortie;
228 mejrim 597 }
229 couturad 951 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 mejri 932 {
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 francois 963 int codesortie=aster.execute(param,nometude,version);
261 mejri 932 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 francois 1075 return 0;
285    
286 mejri 932 }
287 mejrim 597
288    
289 mejri 932
290 francois 725 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 francois 1132 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 francois 725 sprintf(fichier,"%s/.magic",getenv("HOME"));
296     param.lire(fichier);
297     param.enregistrer(fichier);
298    
299     }
300 mejrim 597