]> SALOME platform Git repositories - tools/eficas.git/blob - Aster/Cata/cataSTA8/Macro/macr_fiabilite_ops.py
Salome HOME
Modif V6_4_°
[tools/eficas.git] / Aster / Cata / cataSTA8 / Macro / macr_fiabilite_ops.py
1 #@ MODIF macr_fiabilite_ops Macro  DATE 27/11/2006   AUTEUR GNICOLAS G.NICOLAS 
2 # -*- coding: iso-8859-1 -*-
3 #            CONFIGURATION MANAGEMENT OF EDF VERSION
4 # ======================================================================
5 # COPYRIGHT (C) 1991 - 2004  EDF R&D                  WWW.CODE-ASTER.ORG
6 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY  
7 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY  
8 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR     
9 # (AT YOUR OPTION) ANY LATER VERSION.                                                  
10 #                                                                       
11 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT   
12 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF            
13 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU      
14 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.                              
15 #                                                                       
16 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE     
17 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,         
18 #    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.        
19 # ======================================================================
20
21
22 # RESPONSABLE GNICOLAS G.NICOLAS
23 #
24 def macr_fiabilite_ops(self, INFO,
25                        LOGICIEL, VERSION,
26                        UNITE_ESCL, MESS_ASTER,
27                        SEUIL, SEUIL_TYPE,
28                        VARIABLE,
29                        **args ) :
30 #
31 #    args est le dictionnaire des arguments optionnels
32 #    args.keys() est la liste des mots-clés
33 #    args.keys()[0] est la premiere valeur de cette liste
34 #    args.keys()[1:] est la liste des valeurs suivantes dans cette liste
35 #    args.keys(mot_cle) représente le contenu de la variable mot_cle dans la macro appelante.
36 ###  print args
37 ###  print args.keys()
38 ###  if len (args.keys())>0 : print args.keys()[0]
39 #
40   """ Macro-commande réalisant le pilotage du logiciel de fiabilite. """
41 #
42 # On charge les modules nécessaires
43   from Accas import _F
44   from Macro import fiabilite_mefisto
45   import aster
46   import os
47   import string
48   import sys
49   import Numeric
50 #
51 #____________________________________________________________________
52 #
53 # 1. Préalables
54 #____________________________________________________________________
55 #
56 # 1.1 ==> La macro compte pour 1 dans l'exécution des commandes
57 #
58   self.set_icmd(1)
59 #
60 # 1.2 ==> On importe les définitions des commandes Aster utilisées
61 #         dans la macro
62 #
63   EXEC_LOGICIEL  = self.get_cmd("EXEC_LOGICIEL")
64   DEFI_LIST_REEL = self.get_cmd("DEFI_LIST_REEL")
65 #
66 # 1.3 ==> Le nom du programme de fiabilite à lancer
67 #
68   repertoire_outils = aster.repout()
69   fiabilite      = repertoire_outils + "fiabilite"
70 #
71 # 1.4 ==> Initialisations
72 #
73   erreur = 0
74   erreur_partiel = [0]
75   Rep_Calc_ASTER = os.getcwd()
76   Nom_Exec_ASTER = sys.executable
77 #
78   messages_erreur = { 0 : "Tout va bien",
79                       1 : "Impossible de créer le répertoire de travail pour le logiciel de fiabilité.",
80                       2 : "Probleme d'ouverture du fichier.",
81                      10 : "Erreur dans le choix du logiciel de fiabilité.",
82                      11 : "Erreur dans la création des données pour le logiciel de fiabilité.",
83                     100 : "Erreur." }
84 #
85   while not erreur :
86 #
87 #____________________________________________________________________
88 #
89 # 2. Répertoires et fichiers
90 #____________________________________________________________________
91 #
92 # 2.1. ==> Création du répertoire pour l'exécution du logiciel de fiabilité
93 #
94     Nom_Rep_local = "tmp_fiabilite"
95     Rep_Calc_LOGICIEL_local = os.path.join(".", Nom_Rep_local)
96     Rep_Calc_LOGICIEL_global = os.path.join(Rep_Calc_ASTER, Nom_Rep_local)
97 #
98     try :
99       os.mkdir(Rep_Calc_LOGICIEL_global)
100     except os.error, erreur_partiel :
101       self.cr.warn("Code d'erreur de mkdir : " + str(erreur_partiel[0]) + " : " + erreur_partiel[1])
102       self.cr.fatal("Impossible de créer le répertoire de travail pour le logiciel de fiabilité : "+Rep_Calc_LOGICIEL_global)
103       erreur = erreur + 1
104       break
105 #
106 # 2.2. ==> On définit un fichier pour les résultats du calcul de fiabilité
107 #
108     FIC_RESU_FIABILITE = os.path.join(Rep_Calc_LOGICIEL_global, "resu_fiabilite")
109 #
110 # 2.3. ==> On crée un fichier annexe pour transmettre des données à la procédure
111 #          de lancement des calculs ASTER par le LOGICIEL.
112 #          Ce fichier est créé dans le répertoire d'exécution du logiciel de fiabilité.
113 #          On fait ainsi car les arguments passés ont du mal à transiter via l'exécutable.
114 #          On stocke :
115 #          1. Le niveau d'information
116 #          2. L'unité logique associée au jeu de commandes déterministes
117 #          3. La gestion des sorties ASTER
118 #          4. Le nom de l'exécutable ASTER
119 #          5. Le type de seuil du problème (maximum ou minimum)
120 #
121     fic_Info_ASTER = os.path.join(Rep_Calc_LOGICIEL_global,"InfoExecASTER")
122     try :
123       f_execAster = open(fic_Info_ASTER, "w")
124     except os.error,erreur_partiel :
125       self.cr.warn("Fichier : "+fic_Info_ASTER)
126       self.cr.warn("Code d'erreur de open : " + str(erreur_partiel[0]) + " : " + erreur_partiel[1])
127       erreur = 2
128       break
129 #
130     f_execAster.write(str(INFO)+"\n")
131     f_execAster.write(str(UNITE_ESCL)+"\n")
132     f_execAster.write(str(MESS_ASTER)+"\n")
133     f_execAster.write(str(Nom_Exec_ASTER)+"\n")
134     f_execAster.write(str(SEUIL_TYPE))
135     f_execAster.close()
136     fichier = open (fic_Info_ASTER,"r")
137 #
138     if INFO >= 2 :
139       print "\nContenu du fichier " + fic_Info_ASTER," :"
140       les_lignes = fichier.readlines()
141       fichier.close()
142       print les_lignes, "\n"
143 #
144 #____________________________________________________________________
145 #
146 # 3. Les variables par defaut
147 #____________________________________________________________________
148 #
149 # 3.1. ==> Dictionnaire des valeurs physiques et liées à la loi
150 #
151     valeurs_lois = { }
152 #
153     for la_variable in VARIABLE :
154 #
155       v_moy_physique = None
156       v_moy_loi = None
157       v_min_loi = None
158       v_max_loi = None
159       sigma_loi = None
160 #
161 # 3.1.1. ==> loi uniforme : transfert des min et max
162 #            on définit une moyennne comme étant la médiane des extremes.
163 #
164       if la_variable["LOI"] == "UNIFORME" :
165         v_moy_physique = 0.5 * ( la_variable["VALE_MIN"] + la_variable["VALE_MAX"] )
166         v_min_loi = la_variable["VALE_MIN"]
167         v_max_loi = la_variable["VALE_MAX"]
168 #
169 # 3.1.2. ==> loi normale : transfert des moyennne et écart-type.
170 #
171       elif la_variable["LOI"] == "NORMALE" :
172         v_moy_loi = la_variable["VALE_MOY"]
173         v_moy_physique = v_moy_loi
174         sigma_loi = la_variable["ECART_TYPE"]
175 #
176 # 3.1.3. ==> loi lognormale : identité du min, conversion pour le reste
177 #
178       elif la_variable["LOI"] == "LOGNORMALE" :
179         v_min_loi = la_variable["VALE_MIN"]
180         if la_variable["VALE_MOY_PHY"] is None :
181           v_moy_loi = la_variable["VALE_MOY"]
182           sigma_loi = la_variable["ECART_TYPE"]
183           aux = Numeric.exp(0.5*sigma_loi*sigma_loi+v_moy_loi)
184           v_moy_physique = v_min_loi + aux
185         else :
186           v_moy_physique = la_variable["VALE_MOY_PHY"]
187           aux = la_variable["ECART_TYPE_PHY"]/(la_variable["VALE_MOY_PHY"]-la_variable["VALE_MIN"])
188           aux1 = 1. + aux*aux
189           aux2 = Numeric.sqrt(aux1)
190           v_moy_loi = Numeric.log((la_variable["VALE_MOY_PHY"]-la_variable["VALE_MIN"])/aux2)
191           aux2 = Numeric.log(aux1)
192           sigma_loi = Numeric.sqrt(aux2)
193 #
194 # 3.1.4. ==> loi normale tronquée : transfert des moyenne, mini/maxi et écart-type
195 #            on définit une moyennne comme étant la médiane des extremes.
196 #
197       else :
198         v_moy_loi = la_variable["VALE_MOY"]
199         v_min_loi = la_variable["VALE_MIN"]
200         v_max_loi = la_variable["VALE_MAX"]
201         sigma_loi = la_variable["ECART_TYPE"]
202         v_moy_physique = 0.5 * ( la_variable["VALE_MIN"] + la_variable["VALE_MAX"] )
203 #
204       dico = { }
205       dico["v_moy_physique"] = v_moy_physique
206       dico["v_moy_loi"] = v_moy_loi
207       dico["v_min_loi"] = v_min_loi
208       dico["v_max_loi"] = v_max_loi
209       dico["sigma_loi"] = sigma_loi
210       valeurs_lois[la_variable] = dico
211 #
212 #____________________________________________________________________
213 #
214 # 4. Création des fichiers de donnees pour le logiciel de fiabilite
215 #____________________________________________________________________
216 #
217     if ( LOGICIEL == "MEFISTO" ) :
218 #
219 # 4.1. ==> MEFISTO
220 #
221       erreur = fiabilite_mefisto.fiabilite_mefisto ( self, Rep_Calc_LOGICIEL_global,
222                                                      INFO, VERSION,
223                                                      SEUIL, SEUIL_TYPE,
224                                                      VARIABLE,
225                                                      valeurs_lois,
226                                                      **args )
227 #
228 # 4.2. ==> Erreur si autre logiciel
229 #
230     else :
231 #
232       self.cr.warn("Logiciel de fiabilité : "+LOGICIEL)
233       erreur = 10
234 #
235 # 4.3. ==> Arret en cas d'erreur
236 #
237     if erreur :
238       break
239 #
240 #____________________________________________________________________
241 #
242 # 5. Ecriture de la commande d"exécution du logiciel de fiabilité
243 #
244 #   Remarque : dans la donnée de la version du logiciel de fiabilité, il faut remplacer
245 #              le _ de la donnée par un ., qui
246 #              est interdit dans la syntaxe du langage de commandes ASTER
247 #   Remarque : il faut remplacer le N majuscule de la donnee par
248 #              un n minuscule, qui est interdit dans la syntaxe du langage
249 #              de commandes ASTER
250 #____________________________________________________________________
251 #
252 #
253     VERSION = string.replace(VERSION, "_", ".")
254     VERSION = string.replace(VERSION, "N", "n")
255 #
256     EXEC_LOGICIEL ( ARGUMENT = (Rep_Calc_LOGICIEL_global, # nom du repertoire
257                                 LOGICIEL,                 # nom du logiciel de fiabilité
258                                 VERSION,                  # version du logiciel de fiabilité
259                                 FIC_RESU_FIABILITE,       # fichier des résultats du logiciel de fiabilité
260                                ),
261                     LOGICIEL = fiabilite
262                    )
263 #
264 #--------------------------------------------------------------------
265 # 6. C'est fini !
266 #--------------------------------------------------------------------
267 #
268     break
269 #
270 # 6.1. ==> Arret en cas d'erreur
271 #
272   if erreur :
273     if not messages_erreur.has_key(erreur) :
274       erreur = 100
275     self.cr.fatal(messages_erreur[erreur])
276 #
277 # 6.2. ==> Si tout va bien, on crée une liste de réels pour le retour.
278 #          Si le fichier n'a pas été rempli, on met une valeur nulle unique.
279 #
280   if os.path.isfile(FIC_RESU_FIABILITE) :
281     liste_reel = []
282     fic = open(FIC_RESU_FIABILITE, "r")
283     tout = fic.readlines()
284     fic.close
285     for ligne in tout:
286       liste_reel.append(float(ligne[:-1]))
287   else :
288     liste_reel = [0.]
289 #
290   self.DeclareOut("nomres", self.sd)
291   nomres = DEFI_LIST_REEL( VALE = liste_reel , INFO = 1 )
292 #
293 # 6.3. ==> Menage du répertoire créé pour le calcul fiabiliste
294 #
295   liste = os.listdir(Rep_Calc_LOGICIEL_global)
296 ##  print liste
297 #
298   for nomfic in liste :
299     fic_total = os.path.join(Rep_Calc_LOGICIEL_global, nomfic)
300 #
301     if os.path.isdir(fic_total) :
302       liste_bis = os.listdir(fic_total)
303       for nomfic_bis in liste_bis :
304         fic_total_bis = os.path.join(fic_total, nomfic_bis)
305         if os.path.islink(fic_total_bis) :
306           os.unlink (fic_total_bis)
307         else :
308           os.chmod  (fic_total_bis, 0755)
309           os.remove (fic_total_bis)
310       os.rmdir (fic_total)
311 #
312     elif os.path.isfile(fic_total) :
313       os.chmod  (fic_total, 0755)
314       os.remove (fic_total)
315 #
316   os.rmdir (Rep_Calc_LOGICIEL_global)
317 #
318   return
319 #
320 ##########################  Fin de la fonction##################################
321 #
322 ##########################   Auto-test##################################
323 #
324 if __name__ == "__main__" :
325 #
326   import os
327   import sys
328   import tempfile
329 #
330   Rep_Calc_LOGICIEL_global = tempfile.mktemp()
331   os.mkdir(Rep_Calc_LOGICIEL_global)
332 #
333   classe = None
334   INFO = 2
335   LOGICIEL = "MEFISTO"
336   VERSION = "V3_2"
337   UNITE_ESCL = 38
338   MESS_ASTER = "DERNIER"
339   SEUIL = 1789.
340   SEUIL_TYPE = "MAXIMUM"
341   VARIABLE = []
342   args = {}
343 #
344   lr8 = macr_fiabilite_ops(classe, INFO,
345                        LOGICIEL, VERSION,
346                        UNITE_ESCL, MESS_ASTER,
347                        SEUIL, SEUIL_TYPE,
348                        VARIABLE,
349                        **args )
350 ###  print "lr8 = ", lr8
351   Liste = os.listdir(Rep_Calc_LOGICIEL_global)
352 #
353   for nomfic in Liste :
354     fic_total = os.path.join(Rep_Calc_LOGICIEL_global, nomfic)
355     os.chmod  (fic_total, 0755)
356     os.remove (fic_total)
357   os.rmdir (Rep_Calc_LOGICIEL_global)
358 #
359   sys.exit("blabla")